;; bilinear-mappings.lisp -- Identity Based Encryption via Tate Pairings
;; per RFC 5091 "Identity-Based Cryptography Standard (IBCS) #1:
;;               Supersingular Curve Implementations of the BF and BB1 Cryptosystems"
;;
;; DM/Acudora  12/11
;; ---------------------------------------------------------------------------------
#|
The MIT License

Copyright (c) 2017-2018 Refined Audiometrics Laboratory, LLC

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
|#

(in-package :ecc-crypto-b571)

;; ---------------------------------------------------------------------------------

(defvar *n-q-bits*   512)
(defvar *n-p-bits*  7680)

(defun solinas-prime (nbits)
  ;; a Solinas prime is of the form 2^a +/- 2^b +/- 1
  (let ((a (ash 1 (1- nbits))))
  (um:nlet iter ((b (random-between 1 (1- nbits))))
    (let* ((bv (ash 1 b))
           (v  (+ a bv 1)))
      (if (primes:is-prime? v)
          v
        (let ((v (- a bv 1)))
          (if (primes:is-prime? v)
              v
            (let ((v (1+ (- a bv))))
              (if (primes:is-prime? v)
                  v
                (let ((v (1- (+ a bv))))
                  (if (primes:is-prime? v)
                      v
                    (go-iter (random-between 1 (1- nbits))) )))))))))))

(defun select-random-solinas-integer (nbits qprime)
  (let* ((sf    (* 12 qprime))
         (limit (truncate (ash 1 nbits) sf))
         (low   (ash limit -1)))
    (um:nlet iter ((r (random-between low limit))
                   (n 1))
      (do* ((r  (- r nbits)   (1+ r))
            (p  (1- (* sf r)) (+ p sf))
            (k  (- nbits)     (1+ k)))
           ((or (> k nbits)
               (primes:is-prime? p))
            (if (< k nbits)
                (values r p)
              (when (< n 100)
                (go-iter (random-between low limit) (1+ n)))))
        )) ))

(defun select-random-point-params ()
  (um:nlet iter ((q (solinas-prime *n-q-bits*)))
    (multiple-value-bind (r p)
        (select-random-solinas-integer *n-p-bits* q)
      (if r
          (values q r p)
        (progn
          (print "Try again...")
          (go-iter (solinas-prime *n-q-bits*))) ))))

(defun satisfies-e-curve? (pt p)
  (destructuring-bind (x y) pt
    (= (expt-mod p y 2)
       (add-mod p (expt-mod p x 3) 1))) )

(defun choose-random-point-for-parms (q r p)
  (let* ((y (random-between 1 p))
         (x (expt-mod p (sub-mod p (mult-mod p y y) 1)
                      (/ (1- (* 2 p)) 3))))
      (list q r p (list x y))))

(defun select-random-point ()
  (multiple-value-bind (q r p)
      (select-random-point-params)
    (choose-random-point-for-parms q r p)))

(defvar *trial-params*
  (list
 (list
  :Q
  6703903964971489086197554246675639225679977903356850289822636738166476446003547497906480347668664134871814237929373385957340894446921493467826156063424511
  :R
  831161733924288783122470714827560099912118065672427282555969302860093332828992900311217314457210177400390208781219901819963388248476162181687273982645872380183108884058735121766332442309588892855367063374634826387900121686933276749299412667389566896521319706799097726727133760317487504936635167161572272929531494800724279513799297759512486641802825824397756603592053758668273562606401511640092633492888337973014057758479595223664154735648758679658535318856728148711835584406572171894974799546559846327450052708899862443343521304483849073190455411918822701941816399400298715751250335397048383492145240453449112854183571100844239092251456625819411327469716950551734353380222075717146919745254245208081882613756109175309291225640264970543983842125537958327790228480083826502802080837568932797748743587986816512776493641053136652172410505810877371530928094497933308883739931023334766639723252786713255771348154628535966262198312261107199609597447284396019971468391386400920398188288565841932737718363631850038529322334812060091078881058867400058675755401158678981591080651424732221703812084749564902223025472145275321395370921609973912106613191388825651914626813133731290888632589844642613456895645203438788238846418673175911436645472906832895574638081717553673707129717471270309406617972724993411401710515376453683254365888722020118154790607993803705064522923368027718360268785199521615797182855780532909476629937553275043981907532221094015796794866706596701564343489261841434623517570764370568141227060468515716008218684260875413148873363300407374923854418058919571093387372121785424110249506471385066544345950156094484549710464843163858153834827280971828947249345630419638177884711207316465374677444831012213155204414330867401357656399419336760936477001274470717801368748896747547467714096528315321472989182239149012081810059548633070805089661032357325366533892812119605414310702009487657493714892052863773376761146972326122272706989685102127181853546810012221766174322949552904018260083198440956877372616654818162471299515000536626838507842801526661194798293170950685572558305539602563710733154646081875055058929921094335497248952368830431323404249789698327
  :P
  66864341323051408829135397071197511916217546610223250170437088547423638016765702904900061136195143487299933019100955504944451849791371316730216931500904723904171890121892913108648068480044951186052030627854414694509225524309072367407392968776282870542963152108154101629656910697222945486238822928700349837666210945568817162624047702518406193479406882737447904626230518398237856050013179688393406760300307861955725875547133618920103409487038536791734328746415056015894935915763848744770677176135702595103699694923419338263822824143567659717300796254810400972350492750175621875780676015552346235065421810809294986479528211853318755912174191951112360126620179249517699911030487079848442262382934644300182011367568810122739513587131110180846800433362294948592548731129159068389119622316247878342777487348379568717217246091469208037232827950068458060575548057855451638021228856755265752433087408293192121289131271231377119670973297641454075626360069131131682551445675757443787282778313692489597781693879258841159971017626579082610987965508313801720990426567836763512581042940908925873031812213212079758731338073792593010532241892494489047702100951118168725329589733267130266645867642638591626305032186463017665404543988171239125461770434606870991769410089743012087903846151948902110083578137980952385176717089424056714085427929448727833146104419824711877412450950863944066301748676641757738506364290786629124406139532200873823028111608679165540177374596051737031091838859959156470168946295845346245445158023235334409128224827563899919018020136657519762453394775691928675489083271599048777958434205862449788099135995101447370981542553672692386078556112986904634872662601711389890969921063899600178720348070173768345901554492001445045087760634483644164807729489365177682241983443856717673015409834294742156269461457634738670944627399506126833648153049585336534155794749746468690690590351207694228455910304237014638727729847851537115510245207488577106869640638813807517091531022078582550975934739151399809475378118578563906935140051913460754090074612372574785780476385276643803619283308394179428677874446578595311140801105140349450255819589314436951607768391336800336755251358144657554116256799642787465987953082409725889880075782299307255298721866067181520957336941630203816595669456841761781010719021419293774729917163
  :X
  12495095577022958324031809799654406404693183508738418891531887604065364258628679144288897453638902111885747353928283005668849818666780616445659079752823324107411035910189266992324206952990739996277603457093019262889498954772768769185163744455946520967961287101539351051543036508614854824161144193573168545557064818995309305502815143219083680870834291742852979531644941154398854829821386296684869087855884324367156252818915151325579443869655212826147583296433472975734485085108776377387854538338792379006514218674379637287935255021462346004157563302839993974890285657542428901967719493764084667702204213632693191747621366558571895768460297910908041503806135072762024228913736671116128754744255517823505537197146030907945804733247188079269664253000318697527088626438806416596542703465654310910687045969130473761483662777760002512273738557550020713127174821972406077036156974932877858970399468349844773488483956568372830889641501963211057081509929804425945940039376057636124072315216291708825180941768256190637692334751921398723241605415518386924591955569867715223340447307437479441179312984715720078864362035410863065457957985171360979841049187450751806628875677224836013245965790501185354260432272308879008742017086380913368907615030181122716617739943251075822271680393615301313276429138441096211208946720223558082554570574903980514601209176700573791365269030659625887328401524846420017077632155739229160775562770090781743480602691574384497848767598312667841736897112144201498617136344740006296140726103668278647186790749309743196316609184942868493153249679984128637484104936136715190317804137284966124263282825450790007852091590479873663137142488753349217214504164531180649082645157905894048765032904959482268698370904592010658666562331905919764872165619361708093666436073961070379596792784103557893527312828786171619136575336150413000692450935892973939182602231118450453747395753368757249806742150962824985065125665668165976865237847805516416466021300557816764932939917230100453480601934834460799443709051524668122460866577660594222130668440868041479191611539006686125033969250704771385174929897524425308142003950963014398080730076031824300073464444408182609025638546613165119502875216534371158078544564738610871262697821125352869064125982518115568617254125018450063674553133411748261174067493123614138317844340
  :Y
  12522866188045535378398959439301489579311112257514437631130883614569308241463129587050318710557454766052120840154265111168293004896006635074947672691432735229579373184184921700785316024431585566809064299388634035673178134114421793182198848733597990148754940875553336235904455072104297378535532203059371542535490401826294871120521592179484739620330232059250384212955640965883608848558678988059578092268955968535107074573596734042100492290620544764658169553152015720114019318817428216695929401128882629443493964813251292380138013458799927491755137903479537465928081632815701195645706892463664294784363288008314193418226085882371371137508313667441202377010299613936725046212184992857214141053120440399558079207386586133013694891576118732468756009938897811165194696222608531344616524943308004484318083643835721384529151358796596549582853001268491022963542042347545746167663860867696765700267000471150037823878262865849745935221293141098853323762176423274912069546928870156652653290329545790586214483727096952328030995305003409943665161654293998115785613014516596601755342876518826594828945075516941254463266106693752461011519581425259740085790410648190956737392609276482303568514779141630000100414339035507085233219563723341987629872170631727093383250415537928539962700752744398973418345421122594530323721342751819433425018586203540902607762796949629340177306949560327511120645368191372981325283489980724436458499995317496409332603970705136564786828371679648642501944516515677505152763192689526454299845133123032213692729423820060536860388916358287192340906435977559306362264300853774906115217580864617504838941546954559991323040132595066774284152454598469328647561764101123763805302165833036397924064759499592891786419983513623034327590837243521006259478309353879644870472822391845780504328020336452489578517423632010190134514188764303454014307876010962229132517339777612455786844937816761942591376602668605070809990904356083003731498648828437763753215133965429158399780340182220356907001924893928018742931914050246130191466650787708839054598530531538499841500390179699867681527476444458187934929366716882238110438563900147464103558798904599793041296480292545519171800660311399974298077031329395422982451937948560638170249542133070530846683216796764221445218075118182844184930970463727517194104479886066833985799718)
 (list
  :Q
  6703903964971298549787012499102923063739682910296196688861780721860882015036773488400937149083451713845015929093243025426876941405973284973216824503566337
  :R
  798200462101757383229913984124724948838990872653037472961318277679205190038216777762367335528783963020158510844515568516139906233972371567943107084529598949314232842994850059207690364063664429482682918860596309306476407258315779416526352693287072744394512002494079197235552232186581597822807629328700057202776981540200512742966601573286622124860711971518229031645137471431786467836040192690512074660687779790642500086083921660311778621495461927313936835201678930050990592809773473231625633440484848010532479030839989418824508409243066520476975509620996809794844806042739528763551770304599595809070212840067109760816125756372857803528201629254597794675416138540594022663487554536094798958438956317201080192307975092051883682225070002565827059788869079039300366019707625137123309671078890058435975205204589057599809462626928278135375556187254408719818826236663739423031734633140857923020815282772016286023813495319708697232522092180539748032778414176839228795778210157048121234626271840937996965213838222332315861344909881866792701740400260095158570222200205737544796068719213748408895470841152850945199884542892505579278728890401837278701416162501676713920440303437462043848930433290424656051475172096188931884946093041836744687882969907663165573172631026859998996412465634187405049659165880880859592132294309484746735970974258125343901516756301611043065310945916858352271463307250616315284354783298023164073233926894322007796772702584586596440877200416757251044035790380582131133270295429007394942950107007795353748639189605918400509233417483062341523629386495679951854832137606077800381563202598827594773252608852671411381892651548584526364311702756281193095523953708084583262107110629189862417575033681168219659686289063714149841686490723530115285721469578942985254794284923999543314955398342930605246503625342367487943167312893917204606068298300562073485617967844662082047739891963446510212665193752706386402264817876997275683772844848184354808488852620419300082083374938511748837640388864068355296025658714471303334879930148834565304514573153670656618656207378170667126796721590855360992466258200177389051938236792310999983551341934383661154317090213722
  :P
  64212710912710728528960571904374093783343775736116705867217280646722115349390063979685580115969982070407884999502451609657849334535896393555295124292499456558644871499017630001364309591456667300293590289126095632245199671837422413743803661464119109236600276804481418832936919671421884367207135972833904659779080220990027142645735087825566905110420813816073211911794283101990645580592048585509859593523377031746430313833318341240239967673502322092577442852973945118071085546442378420641676475187820686394741837821254841635585702647579835284167587999558537240808009890877642852859718906716800888017110317958068203115581961576812341565455247698611828789086367825261930605582510055910678995124245788406341953481447192895472964744480577711394916733870349800123393451018232218919105669884420940641947200781703630335302858844081092895394397901233455595509820652097076542846315661534834377267834475201902644665059584905065442309365538086367772134625531002554709211267649453690326143583777278486604538865376759033376711305401879670174669647093455554676519600990986779290811573677024099144103867833822560464625055417769686490734345141055564431070298977152725103756795162334448833308860295929810870411125889858444624381081025254274198293730401881790875881528785548429125864991524147633974958685580283924984254818642083723569809661307884688368868428945002345273135825423251023736455065533801066502445469329817839559941853706500355868737688009484192705013832120389597058617570996681487749994666622354877005056871793241397286347727121392817449479959179828781680516766270731096674377570671205673744295396571341022477587348585658909895474948773107546732016188131105826014131428481625475645151581957574501054013986250331881195856285327056830303506169590283407731104334112347084395744164930749461300606971041291978283388138663535041540070000537199711173095723750483996803337106473889043787526067042023677598988365894058082394742488398054479613718761883637005576552922988429432633453236981777592495295914393127350975169637143433130585585340896841385834436694470252535945228793999232721139357902720893312796460465631339233924573578225202824672141072582228936027864556736747114367670092575210853320206872334597664382705725281568962922114717996599337449458923054311800030419370843107393271530837306993094636510758759858972206416115767
  :X
  22669012997977835235368112152071248125342352847458034589692006970857401900771896132335789996866736539892778063283513660291939475845355658466699626609194605777500875768799050138725922432389335499111103530080817587279149410765072552872066623977541592754138046798181150184059082079557105883179102346405171659506827609143995971490235418852030638320399248476642704049134886842189407174360655618866477235195266170607961053010268575056190539654679337284443789551370054211342063561321610187992563753250975285110214215638011433215353711684000720730571763909997943333935126408956060459013942582474190555513774094793186080707915031114482058404684439827101879406038247749149957789518421280926132243754287326423343282964051264094430173553316515250690587061804648725241355848145181228853521225497582715841821458486916413168596820381937992966608702652207708066677087818055451470620943172040489977791473002816154506002463204745728474391096794348205740982374357507243111071596882067637515508774141666008882574108292124327017439264923278491488188449014046213402139597252883707819053373306719804115919181120557468590170179317852760816155364879581429141899344971498836424378753336656819205743506523794252333433354024228553767705642475114156365084047677992867450436653831753556854636497290044640557850046065066934799931691351277151962583468334154155663164780674259152792870764259824562730942159916698458826953141758700605959317125780355242107845829539736407911868327293659420525816159075826575459370269169525381630985165973048628579059058156598653027094778180702968579479363635124422327274137583578327014444005754627919779614332879764583079368363613646304880990993036667290596266278893410351586090817159503885790103467782422589212748003830699706689714322446321036504757751348895375980303303767174485457634203261032708774276541693148216416326434864341957106733023271045711667730079785340500397308033911927756619143128575079683709682250360533021616947407622165434062580470314576640283502947940927792872209973949340596370606498175555930739850502787620135092195596972044715726168152710035963482956847099852797380254386797719479173983204438571651114655259269424416455312428931701171078278251147931736663042490221382712928746225955871081436697536383381325610642147693994897363844853534053357902210379991541001747981553678301370727951917953
  :Y
  38124725067152966203652240935709905834968744377975169120579707145661154699791432056717369251058991727354911445316176929325316939162023238524231883727331489684532697226108480897149048667145519496295272230395807465602372645107348424978323640945095215239014727534033369225758689343142730415912150502226678604289325715235449383315478094593705993100021496145920427326978766598320664259827740307343349934432846397861492626964339776490991974112218032591860075202606702313860243907214767883776782625815604305333522745871057746675782198179481329407101916341705709628615524045502479198593794096374414935564085777131261474817155493154563792607703147927506825575463509692425097242204749528717325049411804936015261533688194792076785850870092194116342254350369446316448349687581058770716211059506226107950753367390068340943387018640821699826874034994032050384867783320850189963890788579313006003772741397736229203426891508298121857193677854093917653763400433885537900441180143150123421719532478528789272060189864226271776521862026553223007034133441863851290584737103981743575657902424489294767491036623917723191856672982262551038212843404111177373876416453574711858029188309045326690023582901795783039983814363318122919077211298704429597086202519354907189899606844071686117699267966631647210951489632801723305797278989157444023740283797405935727297404187281380262153563890968891017043581651328219321071173821518991202978292103995890004737839586818314566297298498509635967232932402498449820665270561106430474393060484783496904136154082452826256414010126200629285767652535304413366768362583085266647531806613345128611995354062501599304813717270800529241385212073225762754494323281884314883260592096212901921861917254681550927142271859896706242674327954948484713230073515571150595978494002027175093278133108629026722702127095705445380129243962494491645671878319071616092761117614958904956614053825798730733178702694292697344641104387834578991224160263933473696196855284548667939471178019564278939997374265491743480172454161132423816414489415441678687987490525473422642506826805929731125030887927728611221408659715329049034823000723178812058195552197003965677849738030604307094371488988708882628193835259268254145670994994337893573101151364471531535427925379281865841935026429546043419592828041481584261646313077842505327834094225)
 (list
  :Q
  6703903964971298549787012499102923063739682910296196688861780721860882015036773488400937149083451713845015929048641535029815695122901848427920101491081217
  :R
  662216746215867286018704349316623786966158938359612316454913743511272658147646789462051127160491643831732520663627415482870980133168982158538127650054706299462695341666853806001760300977156775985364716605129968518874978317193285939995960980253099780228296321852511434676650358851708496015967218732113155901521845526424842243709519232816502106558666884051955958401078598272302512921403304915705406355824348014028644312038374683050599888382880856031676732683773682262228089672548694277036820359111888933872721359864230106754986071346441746506412488428120868568924254649419953898752988393116172547311445320378339902418062846393760550894217666536925829420031156573676956927404860177331751149852420373406626945074033630067613208748073073270662262340273218043752700024611295591675145162233514382461630140900403281730438124662592719286049173292115089593618458021836294899618647758932230787678515092508097111995970081178533986781523767821605507060985042822230404768108494201064588484496639012920391600159324169754304582232235473672078249481660959680763847057007899274996593945444445866277121828842116157828360829937812206482951910977096064020828541929636053166192681506896884483702551530055719272243687639705631924764520461911112257330549938644382975636492403549369514100941351678832489448040886833393310099517416248482356008915758028601180692575171779857132954218328011538370062619654385670096600806122658621605842209035925873952824170218704169561281336287026263717849082022443698054889200677118092379841228659268360751644193990320872330030457919183442440180719878644243839449994726179927939251330074636369569160804185095652433808539213556580428078413346687534921219144478112873008957255965178011500903158342479532183414404253872080683604434298738359320135470365827682863146426683901339974174813795892293117721143078009864080518314512836373949416583450626978067206446757862498480647257406061081344843913738562484745386629714593459340453020667305412205215744861881166671365762629333940461052043294524860853577805152883458593910752854639963876700095886629779788237002344347861380984492467082591425646777023957319375300254797050554425328870064857544014869832676315878
  :P
  53273249647523338364194318291217355605910476011756436643571672840104347357456337121042974775025484121273067222645831015268756958553025324669643033533838272066243597931506769782140756978972955190062252825074438907443057925002129354229006060594343614798851220919248641157320717411959730974392721603076135150732377253677225212208069976785850695002100323911320376494665101426980981118216012187282739291761084464856640423476242493463364267251585327153284881150046569735427713144329326897445421273130026745063859215120674053263838017947544229985839004368800872202564560529863826058583495139219562099800795359693098609029270067493512067031341993827143044309063224445739622981199375587412892287341364461259095938652137407718681649411600737127114985382176959362846691494690044899758891337227795327006301590077566230739324696022203147528660330674682813806054361425816434549824616767882333444016133628963131575438554003742509829387613969002845846997909097207424280107168453441830421321180271753270113155781872523568534149108953212626901083944859598751353137011082390709270174638817515898962208275246461498809172355680359583467328393455773838370647154469309834702569731618204375617615861742485761967007603070808326945333289071220525714395783490822329730530521904390854850129573120705698060398842398256671599647204528851148418565827523706662515930222610267788873145757430272034627165345398896425820835666576356425292537359855941615397911729052036154699998658123967499390579666566421155617852280299593901959314427541833497838728125638907502580430432645132411475756420552428365295802132654085830713990894662001989889898032321137920547443743713919765896647120399934981852658944602231478352339970028885653474948228514051352617688040527290838291860681539698597951040103180893132708083454430296148638521555381560319881318654943488793379233657023036460015372332525713090436462455212770377374858397633201392258279361422824067796948352753752734700595834320173669654270277947178106725440912700973426956531332014471092766466374614554094741732298239273806705918161138333977656035722506366762065342650223248973011814955704797412441822190227065673082191848315478081411842791676824020963013894842921124260461071556912988799836609523259879011838866528991839616077624841424113875571235427275770386121895125355384478221176940187222957335962311
  :X
  53182487010766210483192266447013209924731111915984520479973288087520879144184405109586811434165898020491117206924627744724275300355268247083731372740174541144195025122700639538083203601628606227333304066554775843753852596516621793991266687049266777915479613264647253185187927429464897411095055155486384552507018684012477547091704495187834644891861819859475473744983129138079989580033886502346610622469243301012010231198350881695757159040819715313764960948769713647304256183792063919180375764588363963326057933022547818846767141231991320745490607371079959030702151942539821768275242628864953942883555984155251851550911335227632709713079067407571336472822717032365677731339008062706513698844354928993529603179774395932155533316005980959545598612770064359753536060943157762519544984610331388034167585037410149252945926488140151241458749592123764669453687542324160551930245519734974955379826962576909615654653640482014403965442645161844605857296922115858871146354099974152316917221984183169565793403127476760367939765382173780951653122897541405610820266897896109248770325179223235599503290528233307081529596711343574777041153746684560895384229605653539136771607493357016268487231971529279019814891735515833849088528163849469789881406741265936814921354985434811295863189360526538005952342722412878941678355056222205237364845955672590407233038461666115126527381576042453879176658856109973502052116471149748770361490046067824071217040363366309345957175268011108105814545666531869400597398991792226975344212151040429238659208996744862154881093855219641711429609284905291437603768053767066409009309990887904088135811483732498211106720316727153068483913967294290197583167229346979546436695630034579740549298571105317987850546305736362159976159516607328382420789298976343485453367757266772253197708219345236292978757457549985628366860169199967171399371477123247708933084882877802381155046896911167881542157358950038667280498433860290058659238122167318153255136001861100670331384066321212572805714079930366060843905353018956669385953853906938700685960451120773631653822304748407109716928602978593416250574577718952608336597534696250173126464408724574580188489072081223396842220350745216242925830961400905351211123174324199192875342997722893104736468974650816055047888988613672117337538246210054381035632309107854325269896173
  :Y
  43203776844768461942373169035825554970723851286583501415711400991080261282657994487744764722493158735518894546447272936057235137709264607767966040029251047624015605803401760150177861966992761934319921362270197396668383965288628502997050286043874124931825454650841786148174883695374911567584054721464716524520106850607819059968326495760750057393666116890448989432550897839806457863930546912005731640414180266552746870974113101897355881026323860503306461163578706610349686310080001135087741283269847117331772253504633118120082404688861672633273024611358288930248831890990415271668404783156316874349393350194613198445819337721531619638536354147356255480281317847915693610182313916833749372613732185447923117375409696112361239338023804351830713073644104730374497397906679209413743565023825460338394628879185785081906801695617036270138262271151563085671873940825504485796868566298245037642123529847933067672208612478342329792903004245014533193588019707411640083063206839832579681044134635133523967732995515700566485778433226616021047570077641360033347565054817173234851266380009839843562320141034620146288693613870162618447130568079394118395495324909330769785841410056913585474035108636955670856422164681976779727707970748418735623112953270663096148759447474223608166338470809491349714305743287206092039049613083145806249085187722263255334823863842802144027336416811727682762690706236730735654236102810190513299882869345155874480989436978086157669336849004360869047086466628664309270489478695155738500598416352283446058367003018060084612550514691156834943818329960361802475176326008025345480359835835753775347520015027104127692357631883089664243359487647912904803796417641729380995443437812329245650030370564847388424245637336002562982571809206327597155911816822001805502995227355162111015907896075708678606056741735202627324824026310723579920749723088581665671837024506776076446841196524461447126901911808459359310589630358786025018113179669436908920885226008782503304980358597138621045893292149343998100719847540416189850560073013782441283456052395273245303736100000262445230393162224589226044271797574165799120726360329414114894533878641008893823027847325987229418794468334217151737137564797810963537041875961529063295167111017846921675709879365896978563374754587456756810250947326124988962116475307610050585003453)
 (list
  :Q
  6703903958727801449155028036339728604153350298799000403531838420142568095786030010761405908842839507718031986773589163184063695615077333614640253890461697
  :R
  586309679859851810353549839267997741070437565604545316513376365834665349903876299278034549882565856406189058974193215414799244261896373467981469294164708193064615091018903339291906981569145363896097184955588561562148258311086291773880654278800426807300345666127579530602153785559607939027857667001329954239283059265830443332744412112067964564035790396484953775863301627725293252665917020793706994162967909117643244736182136752200018294677778111725980109183218428225692368235169857525632512554410645184397247956182419120919701543974507033489377647099651056737510068888704318111603438906965064144059249214734594534558792401038747461881499246448508035453988041259916097051182415405874693124972260207873519504439266532754008009181340735910374750210611290996980207546213446075403990139867772109313461562619773711030851344675969302561879230599890994258765809473769416686206430389715501253622687309425554484161797458419212599144795223246347118118213530513520608807606968394107148792652892366643952095074580249094000932883746499821382190429975976857378156404713183575127865101938183107612826351689733780973705618508589029148112439970732637876098891783988452827723993963309181928080146341470619788883728602462589002391273915561341870072734725521524409186324097788541700322789395195246518983858504321653110132801325871359500204718962838676258605665857414792813141918022795405947173218296664857619502397098670413887947913816805472521113370209778673211420758991421490432543694049335737151694098827088117053477611713563279077653624796794249128925941931091017837405476444254609360437808906252751594887536524163018178579748528417180845479666876378618228214858211300641319698846344670697337570154759522060285664332799388471410480816000683523296604682436806042492877783152560169757153501319335206896155591853222425071241787862879671556839877814383577311901013592282052739873432727923726598170218359114336515098761420542817966929383602599742544312404261919351182674684623363399714128247778526610110960358891056493733493098060727396716967295687182240890528388772085102724505192913253651879032361830269494143701386702640453247684198363725342885492190232137921770580639719490750
  :P
  47166765406234685656538986196102740859528062093336313117053630753990786860602806461317568929936134561145808484478714628843372649770140675006665300238041325342064105830792442313170109653030864211854882027660282581664096114206549933316405318047766254843873051622245728505033666479384333428908221356313036420600276308248199246674322194935754840196992952267298760510532909891640512928360982535001071988119150136581062699687983165624673572862662471006003476961549187204792809138090467892432042504643908349804226073568843846438922921157325784815635022797843005112407316082684713123987536575535416108759844705955685396314687488922446202707698468257507974959422777152031348209775240966793714230679741501551837339165717930356811883011208486046345788196480042560628620484890623483316295035013671500480499800757191629670868431974902153972923999689341891847487174958322570875029766488034316840516632015125137225690147868365091751541153104226591832612076757571157711661863687323588129607406540955896576969578308286006912357647314535738845251599720812645775185079459557414197646031023405056960190109201926205147733636925589223349613081323894394847346425130134993818592598001542774215976942457763576069701726361718341665730462564184247550941805238008326003325998448568108243775399995560448284503945429140139473339621641707398121030412558435443657353745935330944756000610390140911804892845326238150847923202931544388045531691445247205980727418484891086411573203771189205173117673542179649329738568025819486964481180185429600243101254155421960595113739732049966348193117308409701979867516324893216577810466811891796200192229551696280208862386341600883609448348272787544185514044609265791690176009169637823610563001967839554430802389891719539914863660105421509881187037835853934171179936497396642399664582247807807278373640121090831069614704706445739261204269956648720427625925133979367274222634763634116993923776855744943970809468390902816176873249246425649313524084915056846640968184527554397403185325474647281116152393312100909387163985708575148363104536060154350450245683320655474526302783041723919260354729887144806416629309404663407351162694539906829365378100286639553078784225674997577406976780896797693759967883830966618222502208088749989251878956354979480972826159227945509495599773904788876864881726496773477046649632999
  :X
  8224237313967364398891687442925900251434949680426593117480278175335021876935569009824635569421316848022707101089153806755801738378674908440905026877846585472278231892605596664111317345471353338756101807359040527729005133800003482182067483627488866059716235603902993827083173364868096044589242182491084354893825530522434504342961494238804247984049936231948155332630715568275558753008939117159334254058028675871597191325034907565259444409229895379653273037185725523162233874375448456256068204185807319742247937170317780643046346307160133107500741744503746478553280010432896230929573464618817985180182661481160217835957100717990100680569226081822487509283120614237074956606543142854725055114905850585257430285208651662825234720283166006651375994588380089400722417862583879640521217548629180910816384225507253038651188130539863955286409540053429718179780210931254774712831638017926204784537693827933850252624728994972809488601119299733952627429026380830045862838245297274898949789443933850326974445498147829584541791775266808731170369186996133057940912914794799294429269177161526674945813625675859516603765662191326680833515205615395005371178269361447570529235773249812376312738748334216407776362375144854543302340584283559231099902905963617897807247257283947025623798632439429530995973039016637683231354670614794154748236848251171110390651081658620330970945677246332671040650320799665448850986895638078219998169669477962168428540750310323475420873273455813459238506340602691342996836911347495437796150062516631811035069458857657089751066689093825674107663469572015273336359173647070825745570506401409855889136566252093659697477555459846088757897801775615690768999812863069799779703622103475768188371008177582317984503760596927635576164631736135603849534963949589977239019279533372904967622149497280268418991431565019245512602479786276503605304622934333916094910651487319023636888872686457370691632654319938697672902394160526611905940572159748385050895292178730646890656994821595574746111772282191123557128835681023696522502369848680379333112093379938921368134942602858193103254355370156118298451726365733731527660933896879396420545114209150847944381660177045708692373288965911878426437635547589031429887577635441917176009131158178098346454430844822840283223975930038651246860344640731947749407338562629433113415611
  :Y
  43094737009649028672342818403177336451045085388316651686139726146531229100141527227689932694336792561174115986120114494167026929217343971356086723921302754315038311424631454435719274300186005942837030774061363716068230601174553183278477528028362266175702788577918966499155556879489086093909245215268423556602773384038000206684349306491516511253393089110310309759403560330287070206491616084006406385222010807471174403870687804220489811992985262995981511526034121571239566638761306617391849998990688853214401790604901088001940230852995077898658379819036711354495375568644478967562047523271408510234827919312829664204011862831650064730094213725393765446295241065550824613492883690087945341676220139027752635146662980284598204044688342803048506652045467572453982560274310402408389051559991602638600477167740368585317096516909357442497890417944784888167795818904164409227887332770075237033349668866197095473796924534005243601223452757002128985401634237820100771550669104046817355848780518486453269184682817058450265703654538015353535087112495332046600616382706557366933827437311269807494687935988862650886767596825619929475455934797840779354716068034541836754858544741005590774128617547457690206650386136262081082732567785345141119832686378626080710667686649454139971876355716090960429271733745178758321704993169473498867194889313803677334527913872070125364592408406269306718835371477555923659368088590567064114182059986358741258907400209163849189019872376517894962286144869883869125096127844526916978273758926686046616967378187703645886174327413270586575482728599084680770419661203913682164203616724726647185095728412876497884165196955367901469902943898704339751273202599947443696563960757183771051499742970767992094621876903341224262982190445644928230074739311787398909919368004553362101184274540151231202845151765364375058450911740092362582469211631689388483944432041954043445413580035813699062125781978698099095566640640294929333082900062931414604562259998845793984102793060368422494887344915435433131064352111418205793230612623856097212621626810915573183293163038976170812876040912189628037612939463712358415820987609327592129003148292923632156119789221298927181214594989921111984279652129077619033168640739011726375431183849224957119338804954612085888268478329535284678351157890261075889154285351021435400619262)
 (list
  :Q
  6703903964971298549787012499102923063739682910296196688861780721860882015036773488400937149083451713845015929048641535029815695122901848427920101491081217
  :R
  662216746215867286018704349316623786966158938359612316454913743511272658147646789462051127160491643831732520663627415482870980133168982158538127650054706299462695341666853806001760300977156775985364716605129968518874978317193285939995960980253099780228296321852511434676650358851708496015967218732113155901521845526424842243709519232816502106558666884051955958401078598272302512921403304915705406355824348014028644312038374683050599888382880856031676732683773682262228089672548694277036820359111888933872721359864230106754986071346441746506412488428120868568924254649419953898752988393116172547311445320378339902418062846393760550894217666536925829420031156573676956927404860177331751149852420373406626945074033630067613208748073073270662262340273218043752700024611295591675145162233514382461630140900403281730438124662592719286049173292115089593618458021836294899618647758932230787678515092508097111995970081178533986781523767821605507060985042822230404768108494201064588484496639012920391600159324169754304582232235473672078249481660959680763847057007899274996593945444445866277121828842116157828360829937812206482951910977096064020828541929636053166192681506896884483702551530055719272243687639705631924764520461911112257330549938644382975636492403549369514100941351678832489448040886833393310099517416248482356008915758028601180692575171779857132954218328011538370062619654385670096600806122658621605842209035925873952824170218704169561281336287026263717849082022443698054889200677118092379841228659268360751644193990320872330030457919183442440180719878644243839449994726179927939251330074636369569160804185095652433808539213556580428078413346687534921219144478112873008957255965178011500903158342479532183414404253872080683604434298738359320135470365827682863146426683901339974174813795892293117721143078009864080518314512836373949416583450626978067206446757862498480647257406061081344843913738562484745386629714593459340453020667305412205215744861881166671365762629333940461052043294524860853577805152883458593910752854639963876700095886629779788237002344347861380984492467082591425646777023957319375300254797050554425328870064857544014869832676315878
  :P
  53273249647523338364194318291217355605910476011756436643571672840104347357456337121042974775025484121273067222645831015268756958553025324669643033533838272066243597931506769782140756978972955190062252825074438907443057925002129354229006060594343614798851220919248641157320717411959730974392721603076135150732377253677225212208069976785850695002100323911320376494665101426980981118216012187282739291761084464856640423476242493463364267251585327153284881150046569735427713144329326897445421273130026745063859215120674053263838017947544229985839004368800872202564560529863826058583495139219562099800795359693098609029270067493512067031341993827143044309063224445739622981199375587412892287341364461259095938652137407718681649411600737127114985382176959362846691494690044899758891337227795327006301590077566230739324696022203147528660330674682813806054361425816434549824616767882333444016133628963131575438554003742509829387613969002845846997909097207424280107168453441830421321180271753270113155781872523568534149108953212626901083944859598751353137011082390709270174638817515898962208275246461498809172355680359583467328393455773838370647154469309834702569731618204375617615861742485761967007603070808326945333289071220525714395783490822329730530521904390854850129573120705698060398842398256671599647204528851148418565827523706662515930222610267788873145757430272034627165345398896425820835666576356425292537359855941615397911729052036154699998658123967499390579666566421155617852280299593901959314427541833497838728125638907502580430432645132411475756420552428365295802132654085830713990894662001989889898032321137920547443743713919765896647120399934981852658944602231478352339970028885653474948228514051352617688040527290838291860681539698597951040103180893132708083454430296148638521555381560319881318654943488793379233657023036460015372332525713090436462455212770377374858397633201392258279361422824067796948352753752734700595834320173669654270277947178106725440912700973426956531332014471092766466374614554094741732298239273806705918161138333977656035722506366762065342650223248973011814955704797412441822190227065673082191848315478081411842791676824020963013894842921124260461071556912988799836609523259879011838866528991839616077624841424113875571235427275770386121895125355384478221176940187222957335962311
  :X
  38123236497311527828991178564550726089352949030317209136311353849666438676895977671375313997535589737693051403068568054726591850730471152432091519015362433732619946819445112192558041998282899438318458788754033473360492088842415187829705073797122216657644567234532118700052319737641342882005473918068162222939523301594512618176619213850730413519709796743844444803528684582755177621445930896916759109002799692160102653629141877869975502113289959712403510118477586593628795867115134881979511460572883904651471340251917203281725194222577322734955670673044052767812508998177651527808349065187359313234103458951206894856254742998328253440139083077874932515439985443760498320194634134556104577127958587264625162672648014995448112979571551005645253464583930451548882370458991334851976148174580491465207421285758716605167058613777096023312306457240488216705817702432151937648356829081242356793125338250166245522353104974520603033624514429508506750888225549695065676317483650018867778322366647410493148073730393512794464395655379094926665094628052033949575656554585725723416256302875941529035825898376582236511821642609486641197900063518710810219328722509856328289403381465878720622811265387517254816070654122228679363887887339712398595837872167647454374626238415115765817678524706167898242932640696074145410419293040214215026206023596096490237864994918522877297833540668920114799481820789710892087605344233358471785929065920004988486684637491421433601830672583599857752522646021473382945681200366419802321548223152194232228226215760079976073182373994775538455507819872574594729476600514751205570093143857290574703561571307496578172495646440425589984973969240862185876852011079930900021548242420768829280873291833154732471084140521454413709479492842887233475113378016751346968405364326798333708989452745405168149765025710824956711985826403563541402828992408318852731932753589235202031235203258029658412734941880076989752637643107159736520859546647985826754604781135014025548246741851162196143326988811250993887540146907170609858008684629595477220673775633782102530902549437815633368088701896768912610401426368765429887316498807312457485292202771822026776471376830124306694183587558020227546119584769480756092182398980104620957652610378991355554056433595478528110952812038567499842602533111547574701681117399253601091037695
  :Y
  27467434463807513321531676487289754048886175445800439833456356174650563957801058227119812834895956353164026674153788090517072629756041334472045716979363519139661046813075338566689850096740183826100516551226129149621751571431336636376113721688257770728447260310045139689804723444238111902700726115927430733454149403837036285895966379941372990296466152519513794161183527277109977073581490603063742612238698082360667980285382650813340898319227240566817399980553555984362921545775487756162667541225636172890902179190995315268101046133174153951545108119075058954785239239659688713670626699537824985687626286729761565837163718238366678953729016402607746098263687631438967826148229200952011666111995940422492178171628535213191035993078366855264445197139275106257728520990625401200229025280626466254151286155210113742218197247051111388646794193145309888181834741612185589799543700929836034068138675479997209928983946635343870675917487751685626420227943949342212210082182424766587517885516253579407483061231372990858215001825273821440095579804309443927490885933232770821008849083020081529194352877572117329912696822611850223417557292972725788684367480336339615057728122963610065341442139496347938514417371901626759475841568052882430254468038353625767034703275326469388681362142206334875341604402285705998635222491109506809531705927118387996682514346289148560390544549080804952296814279322474929836987846613207179274569343898336280261442316135043864043816663224574560557994029093717229649345650691817126455787423818989127908882346572153913436467564463550492360774951650025895799436576790403977736465584636868533189324613529800249266022608420802193016610825058983461659366791010057197123257260077350129061715039503933532065949654668229135127766686009942296504526202407704334631353340022156209484751186013305532405831523424054373584829404865651672281725146374229467412137307070472813223530529233521997439984203647845571652978294500009201220468830815199719245366575807983366240560737662842059714131545516405249668198835664394191169233898992971972756631712723224073946125507601846836614431153575102301995219934050116821997035821826952524131245636367812034412722588807349691121485993867914411478255774375100576993214936859251205766118872794490713780351305476777320927489969107884800243511530528181202355205354744849433180609781)
 (list
  :Q
  6703903964971310458312671358326217823860951347362487538921834222879981666972196863995033598995027490159190823395501172960030938471032548004129907725565951
  :R
  649235259205447950986340871250940345366606836940045767140347033383111867817386366120054143542129268104120593941203453478884309522004208602330439691294880923329188422809638305586307710984267935983394447847917310467393791654533338768340754570405372623984463025523622096456460410681607408413366103077880777603045180159182192632124357852341023917285357938927197544383334847633356839097691509972445666906418280488673620525646347115687853885707744282642289523679743341234215791127063873278151295950884196963716035615128816656374845118314449364018863900514355609841602199024284064432730716819535362999437955601505680044621346424145995516277630207025636571480793308725573658592416477974425715551688248730860810005199768563569856933716081211072123087552921980662387237338528977501032473645657541784500796609516395089721334802137269545043535316390215830859638003715261636804516687672127860171736591742478634020854620603885668944314198212636425768161888787863849446166560888103039697819946100007032111596677520637522585530918664455105387927596193127341972016954285678505060382492736647157794837404181755516538023467505710902540897225679029442662434596755260504663864950647188016595773062998278444920173757351135435507655333509791762024813356713651996057001704411097694785829814352001897797511722524410743303989717752166593171470315270532053606226515325209929900694098157845637929907959552588206377361800399193975280705959249076601849592619783909636009006486008525474188566602746477170707681111448403428159031381892984295410805610534027893495613928377287907133115446706909100866744393204386900961071510813265206266763948613306370230805294617386118795204017351642171799885187456839227143551731647080559410749491307172712684138581051438511559104763769297734980468261140479186216269943948100354355774556756772025229585786809668191530787539827832220356659528964887810941338508535349165435315319125715306249498506440031536896296226846896501734855525424457088475015961406579820986090919504914157928516231446783657094228572501427329627448272392342780397990232666778170943764484137457207454418564515450397829928242676299708274144757934034291140530955426265933794612440580288020
  :P
  52228929940638948074215174948453661384335356699891183193400084448743984610580940986304838509777369869112353199525205702137189699248078624202310440196597676526967012299755941727731501645381041376507115767109812744052473086356942282341401536551267772798222664582313144054686873851708243348283976060188232760347750847998933925809752793511997237493266312628180681575972195817353354439349033485097799801825026065008607729038073996701372619159151395577469869749631228167673668284370854234881159814339654931859552306104535515700234158793648421938106977407461232696184637384783425223239621449285490136428283970334365991269651000980187524698940221760291756881709169989940830488432607148239198314032779551332433894215719887745052784768835510500063539452644158375020215637848343719566186895394505286540366705893704698947300815090293262646504976594838891373995365679596620504981132346349468841336085358600975019086064775371951631637760390904778589246184194764104287804459156971241020975230534716216724835251649546762736795939249179593856796152539268329939057619259269201149774993801565249690995326072236921164094348733845610057301026936494411310043656647929430889759715670387973168091323431556212349510135162289131072861940700801909711552138635774534401591571241872272129583723690256813178376979576021847557848820144747726428517294046859359965295568890097558569903363638673332383347465492510740169139816646256874529947907637063127282926125676209831169130355328526607918549168021806816830142359369107898628835446991584701684283001742936332007033448915553589433173732337250626160485189329142280825117588754736873524603056894774985879050489565503137798209881015624317114408331858154299023136353095318837783717368367554537035365888023684406633592311940166594294178278106813310930373939773140156991847266435187979841582626200231276716567180595434016812082960749046897153166060310768319998567825736346598169365587773599511422348828817481408837202921826617379803185294293736162392254812988811871211912511681383189403143463846715449014204138794228812801125949707039206370017363428332884095582883576527388408979478478419558590252907888255815833660168557514064189558825951344497421488036364429730059375554662656882244659598847708664277936034785113536140431676669656934058161175460492175009196640716309179004972467076182581709022484239
  :X
  12632670606476611358237601749242987335833598980064452146077333224459654834585010940651782776506063714587133143390870431947765784633916220244220099592619953199615411869096460263194717470819398000006594117237726734528286716414035608996884168760054651033864254325603776938024737809190021497585118877562721855390688249465604546040759815421574166051205615163582923422122690911887514759385496179264664303034016637226235273386312187762869860828514823300470379433098119637953525521822238321792120131620049573526814323401723062543902994058287389354961592611215930707858594342444598504378424891212364454866184916187166888168179116815439455335510785638244055355582520384745061565213473059089758355017156346211488522757624393161103947820868924415082634630255828649861396261913930295627952486196939198093021454512443223169308406937985335152335270581308315428283671731145787715057324739460647066084992379997310775273410476731737172600722155446969615748929288471885368263159315092456687451121927054739353752433853301387052567372924353933136835108100788519961352279856562990045564742636356245804967879305286405062373470934644499683740750296326784976941817741906824372633384331246036347656352170905187744611132674253196337126251327181388078635622092784941808159357641421014218154850853252247319934039838998372012674934047156199382735198329348455272248142768170020681359895918356344434729398688571672725963363593613910704510332443792472398441355485763018638155769871745998912925739413199984051878075353086244453362885054702452084547055392935924024944379556933068729654257582601508068510214047620542728920120422611440074355451453963118575765837440699496140023660677528268856242292013662738608063263147518861977215755878568920353917040117061846295108450290991193756258443238196609563622332265528370841169764347693819430885543799967815091697162884838749998377181097327534737322520505349407665135298180183514162881198695201426035763973923902611788558453801346640087537427064041032239952345038575619815075974918312286466037428019041110953901303798109833896627638730146138074139405431912199012938896368946279396525290976531317054152684787087546742840879732147610142269288505134428523638325536555745798251138842537959074360906767243893096625569310575926341922517999257137945854621045996261409952141806126947306763406794063501267719005108
  :Y
  37273620771457450361590969062993316581075059952433331266875676609992231672431376904812386764375673504755473391152940632454194592148060972087422776723628042097660288726077641217008594006663105156700144524913204022748217774865057015589209248383873328256916360037817843739995196427243119246469255344293736208370304925925222290571259615919753029342448609640227450040470558758960076999297255796553718679847933056208962964377373582709651315406026172254653427677830350586685242798287505251796466227657120349983253464077405737812017473794922474794668496738808895468532295207732072688224779832727598200897927740632306261628589760049608788565332807555325673672872984569515403203699462545454387385502739042960953326486875516911157225982637780664459050108582428539534108978784942470004262823066858487525801264962606984223805423104696791140246453456567517316573497092334744139612415852406830092113959477290925234807701118929936700167475183856478880103790693665863017436627668571712704019423312366185119332677330261985383135013691825033997210583262243628175652794473260437348365983399743171798491678757086640052581608500373021321443047961385901649522985675266678293456609259067359416523668917840569485215984797495378859071129204233522274887772440817784909990908062061338293991682476937714487846651650883479868419013708441305046939036091970235680033386523209171582108392375105654296234880920733919164791665951074573743174996087443398357138881381730111124097070793093249677891006728629974851938977077486412724197213554802872070453554279459684902004480752722869970551813693808487776058540964193892945879695654680826518808946429720906302591801749450501983824820445492679154779203326966679020539376109814892545890986703381427825865578111290929863566131506717947208453926270878126359089350422433657699584433498896745670574514603016885371967269051137528009052451150785311896356736905129048371830166128645833468518579291793241282665754377023920639663531264177732388903312671537617749269226177645114811653048709161917992486128602936761746188064161529060913085819781851926789205817286535003638830608193918534552002502888064699589483278839301946875813961774393046970303965262744929302135452830711749374096770113346028428867687249606210812543812068756243019198405425696859237435308950507652580014932295704232991233252031183582953644842666)
 (list
  :Q
  6703903964971298549787012499102923063739682910296196688861780721860882015036773488400937149083451713845016020437095358608309329136275329740905552998825983
  :R
  890428888871128312738360863916072752743667623994109244630324387782250758831770447363447287415215504299704086725331429926130427484154961898930528230454854879729338553929541517447358814332594266430431160006581367432431160152678383649548657346112979956090391375122905289293228804196062267139797268433539186542270159178585513388100591572406454849357942440700691330340165306688379467984971396804331857050668678403171346624958884632190690059531676617845941234428799072719163663368693800102152132056250025045298582610630502148479128881507497602291455972936435100000694950279812408791440264515925365652662191337866804736271051864583521154072257387544722159309564794898660395032233137193089566902837933397138873016217478930466032838358771042269926601835175789006530330398655710481475344489684904205106363680034706713310891902285094734749476980134502132637839737768445234465190309751899413261776197912589873877751015371560744327119019670522796359944243159432382223498077517200237748320530793403305017797424963209679005100333253224687768477040660444597790357665701923886630205704702056066929725028676819853466507990613429312286980130847533208318115751898607817100998854397505813555796435008234405175372146899722706626876568432562961940863938996760378439244650382851168668266950525134116356402293484091696530150061176823790081913585051163344827899094393383381560172170652298421322225199022789234349235766063784694007324071440281895597436190362118606666624218539446758922579103802532121339850004675965580379453034308889042147131700542509083373452895266381377385626647531836070588100292881985607667899179331906057096538174248795886411165717741709691202435071089985375037279337340706113679417540703690438813606948808539858917450723818221495477651171335182059285052504415089390577639187686282280712066002191635450026740962333951120611319941692125031042980858761294835044521779626187397935145247895676612032676924518974066333630597171247477857060488206737838130846801918628730674672719768176817098367200209668256290172345221596266542427691526281527665016570227478032394364940851730144718509893357786798470417780633796167066214686809097081014522665738797435726629650888042544
  :P
  71632197103537738432419803204747021590002507236764522378396897988031237495994363932494311766155461342625357836419712454289585989944996689621243841404646110050013407704565715294019006657325587423014425727153642264324419150924804653059366670473075818850869372539370155057110719897306348526318542272725165808007681974119904299282469645718383668879607312165600956717145968179369057494689650591218894512334687764450070313244077098611074285287205140742272971232187212584410949367429768379411747674674084645409686269090706103672094814230454710327354334692344991277598751205763186704421916545611161726881813558361815518654812448299125690050067582245486467374805245909590661270547600572113875821680112965370728537591959872233753710730998678939440148852705129563533559724715996607234865050313775138082499864983666668217620118964216934865803598233153124137992372838633387406747533277326840117223108724397776950925800838573664490180107171333589298193655682611340214034573521147898062620835222165528101907143322321566442122622624290529547526715364851834619613968128690694573945734059680970934423035948078237925347333498555590161534294040375526131731539690755185970161029298795807611578247943012088998364935129652686812989632292882756873150006074465528553926360800288184680465166855958468350615157877864718017191091614170520480659685117456934666415522366875700659018546323140389702349428484005957569721178303527825438767851116784596441167841901640902772220043996497838642171482414548840236075274170908877098297312871089899379644575723965121501128060020351221995474912670018356397266132982045882548010687071801310209748196919603506313660255526637202505595154934625226266351184964922294267135505303491441735952171520327426262856051645998381516370138569477651082818026831320021068018041288259133859046675079540429074615174612001098492884735586248116587448865924932276810727219733077425280865341002240240068833494611367385401254332604612710553183329904890117281319702545010793558273607720578840754655597010704765868569406178075399402254395852156056341873748668749362928555630588859684681478659754685535342455130264127145439448329832649210838051033979788576622035583330740235761966594470105719101887557123471956238912446311152576021339911007721780550050183174695859908930708980323572483591192999386887381014795291044002459479449023
  :X
  36379520232820144732851707806499108492716539618761894930200584148994339239338085395130964816599791519329453049394746445201238075740390955088249077489045703296179606363290539768755576479098222626438383587814675902295595879027215669678536759248656300806353794355838214284723760514769759036680282361715219232061661977872074203876834295222053398896228463970245916526473857456577569359893301452519637370909988985868017395085481363770596670901714356910971375929968691193259686320871148710655397266593565630334468761908523086169621996585380315362053973955441464697400275155165486995258127276550810416473755624068682953563407970202553006580899180620938232574540212622495118349851321807550338239692885049807483707065534718004082057040343814226163771203507714925061417441747229319949623553102266668859466198292093262803257655657195623950677282624218162943994999261018723359163267604095517833488571562746785891502265562068852149026345291061353121087869532998221231493809063886079780836707692804543814594954935165256192499647753402821001153015882737018475700471467153798997665103236242132368791818369205426218430350616900517529955361408881731688715387321302989401000476903954048980734974685183642627056057322294658569431764578734726259051669642584693746266530503784755498672928207408533714771168728690673243552140315322107469453109952021865654897403897424254929031258589251426520792200051552265803247932217865610303777061279843140156634673700311395652613873766639211444869862677129107948112589030339343958708733259369440356311422956865183906554744241908947017175555238478247964561590535397961768921700564296976414957295539885468606020706421586945469786077630823672424433651426067093583725741739574289591324081861034536510880215300964284089139548324756853225972849244745062796111059085950231140400349125375106659204224665965605238948369418862020139474686491473272288974989617381750939590463290349292789418594528126916147508660278765776921468819728512718990886542509697598457602295682204589578301705873214076032434658028518894984498602651585742650585795622806931868365849388223931180139415107545283631048807048053396435241808506062655723785829324941837319536815119378719983571028632605135216285771852525382967528049840066088534904023848281497803385081519097239553377328270887078527857239717344165871987494597388555687189704539
  :Y
  27880691603117825612926747707068915451345295366041227800620484389314507942061372421208806842851248363779219316854263326742063765891724658590251274973272515738135608649487376827020663929183028045987927700613115913302877307643253201142089055281460725695982352338503876736288613719794160135071127296739308912596894085064516924821771372187270913481894930168842801292913818669111299923702980814641928437969115072839800974699697368502805832687120481457167369219254317986450424728869767804024830092362197116716223055009013665958729812045170736069051884692012116393434662664906610925296920408207887442712274109138443977392679963172651825609924551197626217736266419254604749755598119091328310236946209061392877167142778969460348087171387454688955923836667480702399647695159463530470652085977687829496832479298060294987552282334833393729703922871094091568094247001759456927595342182518509917268543860649868757679407746814075530474488991245614969369860479686321289718008927358759063323143257659312423625660308851895026047281507099209293986706645271697370623896330717859479661324469884925126592094029599973929787091074967197846086998083415476036908964182320386157680177555016968133601247911901386981225148601853594866254410349516548503805019229838173284148650877503189329976291673833352185008649154046288822704123363098993467540630648002193759469163590716270170202846037126341881864898998258965770648631975936464123239630866726493366899000849695764614327839065760189915354120500645143485188431381290865582563200959518425638796608738504730759906745419691575565608447428255297132020536640723775865949731825979424574836417960366811664790381524211091442145786770232858557596832843119966350296452105010896055280141088850808153921611368900675556178266666498816487381280656558468383048663909051200525038758437861871917748028911272824450864673912085794453152209487721387230519626362102038050462944677004731699430401110733856549337225542751635058172180260772264784978281701175805391233540334962646652634958103769207544760280013977044548170260975434759123839108043901523679424859542844284010385533143205888428904798208736301570858867786775784362715900048476908129734807116374280577153381487485969890154490497950620647281839201685706335513416499566787777189837286885614398735852372865329619062519550006371556828137947685372958987228965)
 (list
  :Q
  6703903964971310458312671358326217823860951347362487538921834222879981666972196863995033598995027490159190823395501172960030938471032548004129907725565951
  :R
  768915906557324375175837345684190184007749924990739269240862866153891543055906748560482893100555561836249748541460346197473967480934872246254185759195430120387371043603860919030992376749445174800879119342445067102078826216428699231884178718337904847576535916283023866514668161442787079061600374671456668001745668014180953910064504233471241051466057203007990655408975829062310817859403229749094073708833524556891685105921443223294175327501732190580659179008587571210468903491709148987504535447658247840491157414221262846806328693255048611229554014718506899990084830451572841758662350845133928093387857195957688238545265623062591475235072126478407905986440724170143284113081557619089826996483592744567435771985175827657862352196848034356367584937818230659336077100331339409593696118273034554018513677126487409166844337705671781580486232293600957228723427650325551298741530542153684238506443460873001473521521452646844336366740116852442311154806145908972807129593880771092557998144771460918004944362609551664420707674299846825692314873976158555819449732916871491989547354648444393364806961545388793232111365027651534260852713169227985704008924362459002461045202518000148267824765177925684294925925565777688647253606692941329037018367037627077715615925800677424586234269446905401721019927645221213262210900441996503404199418141836809058072286050352286520044018159612871574081412215961872873426804752706736627091034321143474290421693024795355742199332946579821581481796723603248545205524549111768634815260122021430954569895181243601849361613817400368760459121795746941651921461206247693354384508090425676668638368943703822606120972461567358465657835927218090532385992660549531483736863454073487804054431590569252139691385864571070476354425764286294745384693484430979756026015531096356461050705821066252395522833152047184708734884585041005033620655261916436049319148236815297070210037729658741218877568553707204816405887064211178250692093696287818343898429368595264113737760752106068016158129338140371439811330815303231459265163079759071845086747285146377856728821565595470879671393985918600278217425844375727945957395870944863945511895588939236679731774039176757
  :P
  61856860736389878402926605221600012725656688875795878945012702646758557277729996901487650223757535593208413742259212647245383239480076926881942913192862839747020519627265761325209055405470420904898217771581376217322386010980609434362764912866753510487472220420933007819128259431596056538893280801836086080947370798159215951938070723033079178456447265460206220758661407893997413188506067833350982868277766382732830218880401677244156358456423673399645492887570836758591699827076804738894268422216442065386427465558552237485568562541529825671726063133221167573698212922858296153608377578211736580354495655330102340827833719706977451973815721363477535305993784423029416597408842316780911028900303229926046829493192116338519289754726381777305612036975509852957907420382489980295940218724672770221233819339083790476260503284308127608528980735801918799107496087947729866266744732211769081515300337517529015101838780001403923720868432013207923336554209664538361850354645851168023695232188325773422614546175710141615543084996963066859572608691133921036934403408139249273158369099071819249895519172282584414296686092740523258956189893627287512099769702577100670775176631598732193205354239172486542140524984343883285562790616435233298947022206987766848407023561770929885150124959404521499919241733292267289327208610812928907088743779399511152933049909011967294843012878829295240870793930505903586745837956027167888888036295555431273017330804654154508094747655081233839704784279013515835890805992173246977671847044298929677850923233629739059801591041561250198989436529776073784504552653681117024502685697525698736647209778006820802177274308692943329256976765910059817394100828911171813830770785994804807503121886575647262183681520260420798745678487006139553550894750048752618199945412745971588178045975638408328673308786103816432702998294065420306942830214742057387968684960624413226641559648861404289439303004198109291834316277701763360367102584015399692641878239183405966405736224255801707832484275164081763490666147943420499378607805200915452324342623648865357119983168060028352122502574582935834051868967507285640665346521621775961829559834788182657930070086057541284857425557047661807516584462476696681265206007564913833966170464860867483931698979847818147436712689477492434460282546804177148318687809023487927397610883
  :X
  41454367602162158767634632541109420704836910999614199228509531726616111909759851469906760232260851298691641244329692038737567212704555691189418808463670548351285130336280809223997746313939573607562746958447821206723052238528636247969100618159227932748754017427249102773238195721138525381989105721636529961295116619457638097072285095433818056054583819935218979157971816042804480914426745191989651986193416124623011030979097915015299514684454139259731086010207349216932171048533205240608966260423111023488367815205960961233896901750174178226248589371343450435323679823390605117621677316595343466191207405327453876437701247580168779609906115136413447713007209385817822962892801393436943461449140523306264705041931739404976572327569686754500122762930122089575449152080489333297236772208738177366873378084071166349632304281270184851423517703889922452484895178781322620849383128701962048826521054859426678548445656484294274891558862122530301892751887274625392091212028712757163729719619001524240519681554379698526149784793428367939794630634120488830298377250611739209974276110050504458322873105596927359914716402282857344494943338718547352107394850461948607325358132789565317866206639963852296450058588296083028930944806595634322542656434868754362047651345644242967073518287965564963417853537610979120682731053731040463392705923025636945692767710244579119109351877321049725088668793838739971313210350225513811559280470452419311783692850494840361783925315461668175279541577472753957641678590007813069176514632167640546863141294826095732808840179614704675110248694317877746753436589172430080788720960534207632718993834022291634745615454068751701698592815105341513237335529192204001543469588163202145723226166287352968849662265222266423559697444352630771587918454666727293175316864543923521507233822395029647134957861674280107454705033166892196302031605665790382759945592281375711742114435272132134418935677005857588863773655896284212148270045489255719656079850373315431018397961340923484310336025182818494378275126632124784668884701709649290547196134652704022607476840357213496712706166286397626490605510227970867735607377209038835098684119920274104269208900045822371006711659894660128351818285047238409863533141700071874739752641752209065142421609558509245354097155785238667975366710940807346148160543489470678937042756
  :Y
  4664159430709552874829415273867866908800414796874546742332158495835277130608053544482627621553079442443764250811068612706903469094321560417148415585746752929683226999723914472086486137257994589918547742715730216692426858017353754293761983579271427007405110444578587264021651391170858153269725343819078069992009853436687360996873948765374927671973793114932394949957884517790231166380068728294658136689489890740034224325272284747295186276779111945218182399399340500535850166356025973055032523266400113486534954930762498143694004465279087023004425465047050883840955153820925636844264753257345499787852212385469147069616250933129161721155122687379360777905044349000659564284277292321380436626871981129455837574816697782551689094716541286784734076162145135288504163526936167476732441019748618642055344910353393564007115510789010293982614127315528188295561201725788379931821800542599863708790786464610570512676148620273976816491244092524769227059854886053383532145255513209008660440085409736895820364347057589170733016610190648138902243936536415902765109254478381835799145853855070037254136830317314445021168385935956814375449386561110913604368235860435725813719916898536936081269311904712868093402113306271676086481737287965447799790865442229099222903968572288964969863220266590675747208086222052807553530070136169233288646849604400598618616901543722039267356271725453078825148284033475351835777952875959831041615532031111151776336168060128859631611886789980178160717025421791190147774722009319011700593987538443886604128206870776660719335871300999682856752675229219222640611755120454400283651085368107024908578283070995972111105132806266976654142437274311423702448487543923459679526282660500356737284037461344395991769351803177093567018888144626640284311489215569979537472406148256828279939350412939738843205043400191968970407302241319396084437283171199933289880270708721950834684315405207873089226215420558020538967453770743613966092934833734180647592616177290824905451527623427343970215174519567090330373280987411974337221424231564193674931322356062335628724714913108523969356846284370928752939179657516508898765699270259974496430360417880816891243506085373250609497589350615483104085205215515170314850513989574191125522713642143348890071104632573324147095253771343193914869133940834630946781965506872308871815815)))

;; -------------------------------------------------

(defstruct ecurve
  pmod npts h a b g parms)

(defvar *curve-1*
  (let ((parms (first *ibe-seeds*)))
    (make-ecurve
     :pmod  (getf parms :p)
     :a     0
     :b     1
     :npts  (1+ (getf parms :p))
     :g     (getf parms :pgen)
     :parms parms)))
   
;; -----------------------------------------------------
;; Elliptic Curve Group Arithmetic over prime fields
;; -------------------------------------------------

(defun ecp-neg (curve p)
  #F
  (cond ((eq p :infinity) p)
        (t (destructuring-bind (px py) p
             (declare (integer px py))
             (let ((pmod (ecurve-pmod curve)))
               (declare (integer pmod))
               (list px
                     (mod (- py) pmod)) )))
        ))

(defun ecp-doubling (curve p)
  #F
  (cond ((eq p :infinity) p)
        
        (t (destructuring-bind (px py) p
             (declare (integer px py))
             (let* ((pmod (ecurve-pmod curve))
                    ;; beta = (3 x^2 + a)/(2 y)
                    (beta (div-mod pmod
                                   (add-mod pmod
                                            (mult-mod pmod 3 px px)
                                            (ecurve-a curve))
                                   (mult-mod pmod 2 py)))
                    ;; x3 = beta^2 - 2 x
                    (x3   (sub-mod pmod
                                   (mult-mod pmod beta beta)
                                   (mult-mod pmod 2 px)))
                    ;; y3 = beta (x - x3) - y
                    (y3   (sub-mod pmod
                                   (mult-mod pmod beta (sub-mod pmod px x3))
                                   py)))
               (declare (integer pmod beta x3 y3))
               (list x3 y3)) )) ))
                               
  
(defun ecp-add (curve &rest args)
  #F
  (reduce (lambda (p q)
            (cond ((eq p :infinity) q)
                  
                  ((eq q :infinity) p)

                  (t (destructuring-bind (px py) p
                       (declare (integer px py))
                       (destructuring-bind (qx qy) q
                         (declare (integer qx qy))
                         (let ((pmod (ecurve-pmod curve)))
                           (declare (integer pmod))
                           
                           (cond ((and (= px qx)
                                       (zerop (add-mod pmod py qy)))
                                  :infinity)
                                 
                                 ((and (= px qx)
                                       (= py qy))
                                  (ecp-doubling curve p))
                               
                                 (t (let* ((s   (div-mod pmod
                                                         (sub-mod pmod qy py)
                                                         (sub-mod pmod qx px)))
                                           (x3  (sub-mod pmod
                                                         (mult-mod pmod s s)
                                                         px qx))
                                           (y3  (sub-mod pmod
                                                         (mult-mod pmod s
                                                                   (sub-mod pmod px x3))
                                                         py)))
                                      (declare (integer s x3 y3))
                                      (list x3 y3)))
                                 )))))
                  ))
          args))

(defun ecp-sub (curve &rest args)
  #F
  (reduce (lambda (p q)
            (ecp-add curve p (ecp-neg curve q)))
          args))

(defmethod ecp-affine-smul (curve (n integer) p)
  #F
  (declare (integer n))
  (let ((nl (integer-length n)))
    (declare (fixnum nl))
    (do ((q    p    (ecp-doubling curve q))
         (r    :infinity)
         (ix   0    (1+ ix)))
        ((>= ix nl) r)
      (declare (fixnum ix))
      (when (logbitp ix n)
        (setf r (ecp-add curve r q)))
      )))

(defun ecp-projective-double (curve pt)
  #F
  ;; In Jacobian coordinates
  (destructuring-bind (x1 y1 z1) pt
    (declare (integer x1 y1 z1))
    (cond ((or (zerop y1)
               (zerop z1))
           pt)
          
          (t 
           (let* ((m     (ecurve-pmod curve))
                  (t1    (mult-mod m y1 y1))
                  (t2    (mult-mod m 4 x1 t1))
                  (t3    (mult-mod m 8 t1 t1))
                  (t4    (mult-mod m 3 x1 x1))
                  (a     (ecurve-a curve)))
             (declare (integer m t1 t2 t3 t4 a))
             (unless (zerop a)
               (setf t4 (add-mod m t4
                                 (mult-mod m a z1 z1 z1 z1))))
             (let* ((x3    (sub-mod m (mult-mod m t4 t4)
                                    (mult-mod m 2 t2)))
                    (y3    (sub-mod m (mult-mod m t4 (sub-mod m t2 x3)) t3))
                    (z3    (mult-mod m 2 y1 z1)))
               (declare (integer x3 y3 z3))
               (list x3 y3 z3))))
          )))

(defun ecp-projective-add (curve pt1 pt2)
  #F
  ;; In Jacobian coordinates
  (destructuring-bind (x1 y1 z1) pt1
    (declare (integer x1 y1 z1))
    (destructuring-bind (x2 y2 z2) pt2
      (declare (ignore z2) ;; always 1
               (integer x2 y2))
      (cond ((zerop z1)  pt2)
            (t 
             (let* ((m   (ecurve-pmod curve))
                    (t1  0)
                    (t2  0)
                    (t3  0)
                    (t4  0)
                    (x3  0)
                    (y3  0)
                    (z3  0))
               (declare (integer m t1 t2 t3 t4 x3 y3 z3))
               (setf t1  (mult-mod m z1 z1)
                     t2  (mult-mod m t1 z1)
                     t1  (mult-mod m t1 x2)
                     t1  (sub-mod m t1 x1))
               (if (zerop t1)
                   (list 0 1 0)
                 ;; else
                 (progn
                   (setf t2  (mult-mod m t2 y2)
                         t2  (sub-mod m t2 y1)
                         t3  (mult-mod m t1 t1)
                         t4  (mult-mod m t3 t1)
                         t3  (mult-mod m t3 x1)
                         x3  (sub-mod m (mult-mod m t2 t2)
                                      t4
                                      (add-mod m t3 t3))
                         y3  (sub-mod m
                                      (mult-mod m t2
                                                (sub-mod m t3 x3))
                                      (mult-mod m y1 t4))
                         z3  (mult-mod m z1 t1))
                   (list x3 y3 z3) ))))
            ))))

(defun ecp-projective (pt)
  #F
  (destructuring-bind (x y) pt
    (list x y 1)))

(defun ecp-affine (curve pt)
  #F
  (destructuring-bind (x y z) pt
    (declare (integer x y z))
    (if (zerop z)
        :infinity
      (let* ((m   (ecurve-pmod curve))
             (zsq (mult-mod m z z)))
        (declare (integer m zsq))
        (list (div-mod m x zsq)
              (div-mod m y (mult-mod m z zsq))) ))))

(defun ecp-projective-smul (curve n pt)
  ;; left-to-right algorithm
  ;; keeps second operand of addition as (x2 y2 1)
  ;; for projective add
  #F
  (declare (integer n))
  (cond ((zerop n)         :infinity)
        ((eq :infinity pt) pt)
        (t (let* ((r0  (ecp-projective pt))
                  (r1  r0)
                  (l   (1- (integer-length n))))
             (declare (fixnum l))
             (loop repeat l do
                   (setf r0 (ecp-projective-double curve r0))
                   (decf l)
                   (when (logbitp l n)
                     (setf r0 (ecp-projective-add curve r0 r1))))
             (ecp-affine curve r0)))
        ))

(defun ecp-smul (curve n pt)
  #F
  (ecp-projective-smul curve n pt))

(defun ecp-sdiv (curve pt n)
  #F
  (ecc-mul pt (inv-mod (ecurve-pmod curve) n)))

(defun ecp-pt= (pt1 pt2)
  #F
  (equalp pt1 pt2))
             
;; ---------------------------------------------------------------

(defun gen-parms (trial)
  (let* ((pt (list (getf trial :x)
                   (getf trial :y)))
         (q  (getf trial :q))
         (p  (getf trial :p))
         (r  (getf trial :r))
         (curve (make-ecurve
                 :a  0
                 :b  1
                 :g  pt
                 :pmod p))
         (ptq (ecp-smul curve (* 12 r) pt)))
    (assert (not (eq ptq :infinity)))
    (let* ((s (random-between 2 q)))
      (list* :s    s
             :kpub (ecp-smul curve s ptq)
             :pgen ptq
             trial)) ))

(defvar *ibe-seeds*
  '((
    :S
 1913629390332009452837186269447569577141589148566562749606332948377060908545914801453028086497721845945610879183354892193418164770676277193241796225021633
 :KPUB
 (63575417705605320542705429327823048949857156492539346509623915327388010982371585560693077543534580603849698309575930493076830728414741321012950328696566404201111903334310550753605044115705018854954911526502873817508151231511022040213460599196251186899810487042238327901163025117563339313667811825692303394781946099315135129866673019096775524374006859964786680174718137481128867001892822491122979033966129949928653260520413563478582837524165192613704540728952683048428486615422824877324210510761528143663014684926960989482235649991283241704545147643417139367252042207191155004226100161417836257303714033506151500082022800823160739640151657454085638653262454778900283262941187823611550104391615366163667283145043070205690091029869524789455957180846413208867160109007657576997932685631438256114400576511001214242417201683626233715629462237948399240217927430241690207787529639519590773899173482690009380599537366014124810284850634486256756828025325327712018312095019337937401732194308896687664894433173756909621355975936808579846759610195803298776527025773817447261678485018741197535489307829095556300279770778113444387194954121308890808116356103731829890210710542016187354061866350711306368051434288767348767139306363407923854367534406684628594205195381536704032003725153693453524063220361981157335851755705438147777158141076910775451890619503394281334379441465589925619088650554744852159819195469969082345060945368447720014512822258015806060271138552106314788236273696047486461773723365040526151160023057371228478480805479906112312866471454317458957830953387276981807069747867005510393156258725109125153461329991691962851195054110806252267724860184453544519065084198115394564189210992743497583730300125189070951163859027543230126770729195694253971792174166730410658373859152216811848020468611947595335396390459288391876947735242700673171300586402881323039668523829940786005458709188847305404724718308728004750630726323081598885243569570091404087144808448598219544437250545764624106356539250825518780579441575583869892157169627784325737623399974222452715651337012684749171824638086284812969930030370818670421405845200348662668627750082985931180681064062092425995567836095157036858081217109607763080794241808214806774215708272760538781125651260524044467470058725577350493130719830103322229966859730454106290548329854
  64567099306147142084289950253837407892845608118640755536141112075905189433453509670613417906488673268801413850762618831069174152030177575653079738472764360925251430852458070291002868992547570728379166975849877274580125622742086379306238117162118120359709217449689908235585861312108465279146703797857106248260313465691344043104496087385859902659715853937176026950319628512260978848422304651143076807126365678521031422577711050183352414931887458693539807532380904680566178734262220913119608410007551699887729284792678361619418261281902913279012366516036839636407773502133176751947093990977095120441127902811784212568130098809144926359920590186000897668540302273393117961158517230845523726823764469846378494474206203339888557767554840109842788167294087778933859895314578768219464949114497105648281584924877827703483305514645467287739664059669418647940031026021227069883501713680875507260276668233742930691683610961427966637417307686976138846443794756528604988095512585641391873700364378288600121667521872453786424216560615728103345430199352912709397623694758096755364929022370934140681566100033796508579548308888536217568480031417680690068252573207377981707005030827883704423605983571057854050510396326992760501506187342735289413213253936927192192196371389946395550334060946543081710071464672438874814565154067225700826578998042587633829463168972040774562177848448216294833601487988648698247832830236277893322434277468733607657854343873780550525555261827050134139349255563197090555147711358540622987603767393672164419919918588867959173892711725832159650957763476903075820312610721487217056934529985078921295237444207275963986994834908168242580109128987685729242411729007004728054713999212912995057844088865622821942052814907218763270080739968890732414544679038493488350133139685464202782202120622141111530269939404856205523229549877289145318866502879058011940948748869517186473433684712198567162576719940751430212701483592218389269845517067172541374575487091319751908126980042355572193107052531527705049631555662551598768747080538752111297050848667602409187683994271133398735971778377100164425733297344995648437411713429902893756054715634707014888160129370176595729963240283749769782733975033744158292245024397231665638926074962101254461658953234908460368352227275141848074475989228965385083756236978258973886900710)
 :PGEN
 (60341516926038716032031931732399562382976255414046404953913210237722893312712707777112865367283819621166629926239402341422158532849015210704193326492819158340525452127657684561628364683312237647777742901273248125822018262339679532677050840538764325470778832918602997147691994780855309575129535647937758784453434705151614710257076608986177214548016511917447428360824681310476987837150652137878351346366321673540483729156502295705507644847420391801298338429753119259477024346126511987725918261956525213669148167220348194552564600527261157681627162091627675579849659099167749693619176821733089987791364159826751295144040491694355019137239333484772935903399630388247646125791801477394155522160550321775408584298337461035166280356563747617587741365218696439413854201624285690762976240524155524911759127852109646225048733299478999250244449041731096144124706905343582154801351126959642964879002960963028411577901025011704920924933911299291018430446273911684043713481548964615914409930160320452893760098652065103716726496072565358590667244433720170475727991649557675131619272559603699224242465451752571081874394382924257941382878330802581811214000933942665353463130279206035097996103698903658176653119310735220191895508318347737339910618827925841037073434194765889175921411649830099912896254694231311727390289188382908289895447554374594785284237804982306940112824008603352359687744876881113851979531693257262578357358214123841841375709434720362088938580620239567887330859032139074635206639552968169533362960026791574758356247185471656618381269205235417376514649826751158662171470436728201912211682037204116287646306164004535167653737086412670209730060388854518575175325869513852978867405681142717112971771337776991934720223229775569938722559398625386606716028321981434176891805634147902617834839426235719888010715668782882722641584231860281311454865329509190950923653678061062471888180278110069016350649045343261412103033759013196756946745225980355846849291616762636946601109481975960756260380457063387687865561339904457457944308122916153039101078007387618074512305228145978995736886762326362094857181294612523663524837334851955496925722824740004387966669121099063541226411188033756514335008659686513073338717133043330680746294283800755441946349815273311306670010411091765093246837749726021123417732817913912126580993031
  42811694177875324543001845972102697402571334200695294604422297669033019883334270216077309635583824703059957851568515163932590960741721353489845826287217976875779955138085479974302161737485072771725053333391723520720958579153566781621526212045438100450885721441767440677230985963849443929721854761770683169691525687518925494772317748608612332533525733443823525980101593376684786138946477874434226663851884386601212464337750331701184456355585244849602800168980911629340194000326471845363690255315786279102455871169928494241195868991788342289933839045996880917335309761122719632785801860963347698973010928514103051380125309643025571891890450372740728199593625056024646532532373381027418612375305946900184256676056319466593616619795476010865634219551318794779695835068693789897694774641929248212891401561779626990828504869724706365865352006831742121983038617445108183279633397891737570675076226796203587854073126851952146921711435501945299882755591752983233999587899439053730597493243095438595102353630503342237559800880254387366847568631061889528131734441338198982498766500753971698658329851558215424321390798180366771674707794580640179122399228467666683780629638129837820993993262521955488902011876355214700813918414016079501071734785295974712972371454917034597556311652803824827771247924290898081311968163602858902588252784290887948693392948638520113485065249841326295962257874279814219704389953242794609029516054615112957371951488571227493940610292962063533264252186060897945726236482317064912776583199376599725133541744510310382273993118028679223724354228923341622842306956943412697058808972097545179196139618656607818941715900735007377682945545861650839632487988797332702709692794604411960643919808345399584381799079767488054182200603167378129682204293373239524408843844913271497833546227114017904036430663269110672781493964507548347568903152696300447892353844293241169667744883034367187392511412605319418715486580208687655286662279293983477782396514994255985644841110306876624489330470797303507561694326164487065955358508149598617348300004725175791992338239661290243858895352396139660746930978751054133640908235857732121034708229805887735742493941969376144930234869362074037267321968981881200771073024853273176068498350874741800696589623902640668666900704234262328826510969464077200945976020144366082256329799)
 :Q
 6703903964971489086197554246675639225679977903356850289822636738166476446003547497906480347668664134871814237929373385957340894446921493467826156063424511
 :R
 831161733924288783122470714827560099912118065672427282555969302860093332828992900311217314457210177400390208781219901819963388248476162181687273982645872380183108884058735121766332442309588892855367063374634826387900121686933276749299412667389566896521319706799097726727133760317487504936635167161572272929531494800724279513799297759512486641802825824397756603592053758668273562606401511640092633492888337973014057758479595223664154735648758679658535318856728148711835584406572171894974799546559846327450052708899862443343521304483849073190455411918822701941816399400298715751250335397048383492145240453449112854183571100844239092251456625819411327469716950551734353380222075717146919745254245208081882613756109175309291225640264970543983842125537958327790228480083826502802080837568932797748743587986816512776493641053136652172410505810877371530928094497933308883739931023334766639723252786713255771348154628535966262198312261107199609597447284396019971468391386400920398188288565841932737718363631850038529322334812060091078881058867400058675755401158678981591080651424732221703812084749564902223025472145275321395370921609973912106613191388825651914626813133731290888632589844642613456895645203438788238846418673175911436645472906832895574638081717553673707129717471270309406617972724993411401710515376453683254365888722020118154790607993803705064522923368027718360268785199521615797182855780532909476629937553275043981907532221094015796794866706596701564343489261841434623517570764370568141227060468515716008218684260875413148873363300407374923854418058919571093387372121785424110249506471385066544345950156094484549710464843163858153834827280971828947249345630419638177884711207316465374677444831012213155204414330867401357656399419336760936477001274470717801368748896747547467714096528315321472989182239149012081810059548633070805089661032357325366533892812119605414310702009487657493714892052863773376761146972326122272706989685102127181853546810012221766174322949552904018260083198440956877372616654818162471299515000536626838507842801526661194798293170950685572558305539602563710733154646081875055058929921094335497248952368830431323404249789698327
 :P
 66864341323051408829135397071197511916217546610223250170437088547423638016765702904900061136195143487299933019100955504944451849791371316730216931500904723904171890121892913108648068480044951186052030627854414694509225524309072367407392968776282870542963152108154101629656910697222945486238822928700349837666210945568817162624047702518406193479406882737447904626230518398237856050013179688393406760300307861955725875547133618920103409487038536791734328746415056015894935915763848744770677176135702595103699694923419338263822824143567659717300796254810400972350492750175621875780676015552346235065421810809294986479528211853318755912174191951112360126620179249517699911030487079848442262382934644300182011367568810122739513587131110180846800433362294948592548731129159068389119622316247878342777487348379568717217246091469208037232827950068458060575548057855451638021228856755265752433087408293192121289131271231377119670973297641454075626360069131131682551445675757443787282778313692489597781693879258841159971017626579082610987965508313801720990426567836763512581042940908925873031812213212079758731338073792593010532241892494489047702100951118168725329589733267130266645867642638591626305032186463017665404543988171239125461770434606870991769410089743012087903846151948902110083578137980952385176717089424056714085427929448727833146104419824711877412450950863944066301748676641757738506364290786629124406139532200873823028111608679165540177374596051737031091838859959156470168946295845346245445158023235334409128224827563899919018020136657519762453394775691928675489083271599048777958434205862449788099135995101447370981542553672692386078556112986904634872662601711389890969921063899600178720348070173768345901554492001445045087760634483644164807729489365177682241983443856717673015409834294742156269461457634738670944627399506126833648153049585336534155794749746468690690590351207694228455910304237014638727729847851537115510245207488577106869640638813807517091531022078582550975934739151399809475378118578563906935140051913460754090074612372574785780476385276643803619283308394179428677874446578595311140801105140349450255819589314436951607768391336800336755251358144657554116256799642787465987953082409725889880075782299307255298721866067181520957336941630203816595669456841761781010719021419293774729917163
 :X
 12495095577022958324031809799654406404693183508738418891531887604065364258628679144288897453638902111885747353928283005668849818666780616445659079752823324107411035910189266992324206952990739996277603457093019262889498954772768769185163744455946520967961287101539351051543036508614854824161144193573168545557064818995309305502815143219083680870834291742852979531644941154398854829821386296684869087855884324367156252818915151325579443869655212826147583296433472975734485085108776377387854538338792379006514218674379637287935255021462346004157563302839993974890285657542428901967719493764084667702204213632693191747621366558571895768460297910908041503806135072762024228913736671116128754744255517823505537197146030907945804733247188079269664253000318697527088626438806416596542703465654310910687045969130473761483662777760002512273738557550020713127174821972406077036156974932877858970399468349844773488483956568372830889641501963211057081509929804425945940039376057636124072315216291708825180941768256190637692334751921398723241605415518386924591955569867715223340447307437479441179312984715720078864362035410863065457957985171360979841049187450751806628875677224836013245965790501185354260432272308879008742017086380913368907615030181122716617739943251075822271680393615301313276429138441096211208946720223558082554570574903980514601209176700573791365269030659625887328401524846420017077632155739229160775562770090781743480602691574384497848767598312667841736897112144201498617136344740006296140726103668278647186790749309743196316609184942868493153249679984128637484104936136715190317804137284966124263282825450790007852091590479873663137142488753349217214504164531180649082645157905894048765032904959482268698370904592010658666562331905919764872165619361708093666436073961070379596792784103557893527312828786171619136575336150413000692450935892973939182602231118450453747395753368757249806742150962824985065125665668165976865237847805516416466021300557816764932939917230100453480601934834460799443709051524668122460866577660594222130668440868041479191611539006686125033969250704771385174929897524425308142003950963014398080730076031824300073464444408182609025638546613165119502875216534371158078544564738610871262697821125352869064125982518115568617254125018450063674553133411748261174067493123614138317844340
 :Y
 12522866188045535378398959439301489579311112257514437631130883614569308241463129587050318710557454766052120840154265111168293004896006635074947672691432735229579373184184921700785316024431585566809064299388634035673178134114421793182198848733597990148754940875553336235904455072104297378535532203059371542535490401826294871120521592179484739620330232059250384212955640965883608848558678988059578092268955968535107074573596734042100492290620544764658169553152015720114019318817428216695929401128882629443493964813251292380138013458799927491755137903479537465928081632815701195645706892463664294784363288008314193418226085882371371137508313667441202377010299613936725046212184992857214141053120440399558079207386586133013694891576118732468756009938897811165194696222608531344616524943308004484318083643835721384529151358796596549582853001268491022963542042347545746167663860867696765700267000471150037823878262865849745935221293141098853323762176423274912069546928870156652653290329545790586214483727096952328030995305003409943665161654293998115785613014516596601755342876518826594828945075516941254463266106693752461011519581425259740085790410648190956737392609276482303568514779141630000100414339035507085233219563723341987629872170631727093383250415537928539962700752744398973418345421122594530323721342751819433425018586203540902607762796949629340177306949560327511120645368191372981325283489980724436458499995317496409332603970705136564786828371679648642501944516515677505152763192689526454299845133123032213692729423820060536860388916358287192340906435977559306362264300853774906115217580864617504838941546954559991323040132595066774284152454598469328647561764101123763805302165833036397924064759499592891786419983513623034327590837243521006259478309353879644870472822391845780504328020336452489578517423632010190134514188764303454014307876010962229132517339777612455786844937816761942591376602668605070809990904356083003731498648828437763753215133965429158399780340182220356907001924893928018742931914050246130191466650787708839054598530531538499841500390179699867681527476444458187934929366716882238110438563900147464103558798904599793041296480292545519171800660311399974298077031329395422982451937948560638170249542133070530846683216796764221445218075118182844184930970463727517194104479886066833985799718)

   (:S
 3128136934159484539265067366318573473875376947438431690183659466544559367666778324233200188759794998755768785702024365381913921289692608327357775411409311
 :KPUB
 (62857561206065029697752075972940067001081791262719965229285051585011769358845847507211561005552527433896106625884041436916915630145994140521767003200693271529209321684349310472979546109503473683855516283176497758415032679910200393411591477523102959162119234585765412141561925009728955932379384976690563579875319737711155804214111473136229249503312868474458074363605342559158120043602828528826378493102937688170863925267212715554269483006124856686036021722337973347756966220534227056406235073795338860303492495870806787638683355315583580180085834460129696463437678011606713252025115409134160834353563067368587043861554682153703547582388612079042586380531364214768953570712356969605226019767696849208056682059957393086695898602974636645326325958759967371821554644242296792045831809074225347236916483815535940766584078406367045120590565479053067055060993593141331855945639987746802225446536461046564326938061827809187051344393454045244908486905897875763882744490797711085957730192209196293252917402921953169930925824313864766549642428985042210998798256734605106683635005218185929756972932916111724238912376945343612435731902693193933327855864081921275950868907059974208066728612935314830919848155805899957915200394818520768692115431624461725166054468134349836363907121547869736146667342523916761070477549075499768755342509179276076217287888386186217924322561268527319095190775781664721739426565645319375161923072193686160337696981755661084591282862219878562759367032880307275150419837437177369135854621802674668732431086015948952964677162393154035168299292429207543794298936643057967127601832502274121524644830177732842478659911909722390191953214262802970673601759200500959158909243395472902814073099081199622445758223905246488436066330105783966360787859657000720684456770952502537467844412801163923083795891295970809201886718358506956943648187748045267663072976607728399814486567048348932824882512617802252544994254101471784513826650618972657058920235996208668615287952349176048011631129399062823968939873332900142272245165987390288902435046412773275297159672242561522678546331869810297159003376005289555297233879176340828881695629817503574014164842024947577405770064765638378330459778797489157539471122007439940932054733113097645353427657687593776638891853779462569414712237974429071984038809033411050590825904142
  61570782727177241240524317048948468543725985719901401037779571485805684020901570960029639574291489797556172443198675344570028321225312317719302357698234534483719311247991453496653917646897739657974591581477298840917381671960261318813269457533364083569783446518773866328235598154618677974159810694023795994332520984301276296160747187945023235880759014921087756546563108133647677054565756319656961322106883462545280876340954358031542120116719959440798718753380892174231334556880444464188898094327104166177654461505234206723531364911111185060610019359124399728760046437110026961795654536575169472538419289195317488743100806455300220678966815775847464857866715692503540224313480392813592677088815857057214847320691565902343525722106780048969072666424419470630009743043124812094488007873315133302797497183822231130341009110094303388590227073701457173307530070210979598070593349983683139624744196230787449671581581170199080955916803729735724487688431593271188966142481809554188049540754751042769543696812207765199633613665497343650550159502447839182347590226473737831520946704509724738683809423226301911073863278861685789749739339930387265654508479875161680728557828935111625368286682234834974626777133115700225755454860316120413383816875207171374114694291435928089657786284146698365385448661148930837324808185931047444936242274680093920438469157475525560064708427163372357126597974569245163573222995153925413451430299848516392350425191594616180167825845467140569354795469991867898572611417322709925617781807692900250390452558786708448786086340835608110336389584119356833253175510618079593018401845445299092199750878940287144321215252752137851719167072475138297550024011183982525449880009166921412151903502265441455868069033757429366553873880971129725011120680100709107164368607906755214598829525016978312620538538974394815270383044488878112225845421848446163786906137668826001196636518081656731461422379649274575577248683503267030930733928676322320447096101302058244920650678565474754007657337996423417154404421373666705741740061744132423444931808404318792828763376020524920932346878928950535921272970221931376212495665665495224691554158954358877477080963767625249448079436583521089041102984833605340061621847037519806282296756968159808289257437742184797088946885263083144129435114575670874658717148345432709912873935)
 :PGEN
 (26876291329727464693212023195456180179615420930205049478258323372057048817890384428104077368334119935791182300822205588635012926330433063698584264651402233931634986197568749501939745580954415716502858618039270181688899850397583765399230586505189660672640643565079240236077907571327149697031220661875713533268281388352566030648652501916864710829286099122719564942125950398516407014771879498387073441092647449615682671569403077744718160270938929671335597744444010835716973427498872465235315596181227877244262934054725774521887155397348032453301819335727628089952544793737953825587975553639517494371053248416896390130420992647933787226835304039856028493894688809556789025626261268948375814444303884033671942930530011912438809294287970289854576452550021882992284310409767003849189313222947556992047289223821348572997795792192460361878350977257328093313344669101497617704165374417988242587285944225401965211680522958270401369659444866419200782457340519360292329977780281253834693474563601329557382255261840893410285926028281412182564455518988171024775101712211543333409810730669714692692406298700833348933655980349479828060566032966042528499348859329341075641139359649835062470505396823442790714567000544786221619681811926476907851404349420997853977888301239189921469445046239365529874048297122272905847812036499962005228841168131427679424373126515954244352212592075988987581656986384139959114369150453982732179019111986256470408714264733079322840925777181220527674882296551259508863431467870441851972232687345052138719796558430888634842453466549410175823717117741617699353327825722086609612540308520600040921302410984493975911501341857927845643628517748172904991076146657181589671888025315792519300161311788706867179855565771939563729584970308880340603037655080406304476575566451326937615166949910601217739666709421503815563954356947507471034079926963478526261607630645234021382359652322924649390226510357884747641281907792302327075286403293604744933102703634633490222991366288965567256753173079039032028949173398385156925513450880241871227232455038525975233194780811187278099672183315130853846501616068779005213895760367724967677267630713462993299451035287875185721149475101917108739419755030290803899636727277808968540899779114130424321146168821577485526994423274237835047461485694437925335918935984125041348904216
  32302836714082061505215569817763556588170757692677153404446793697287992369895329609379922847524178911098602129710478083425567369975729981079159829571792428397040365284503624275236385121065694711060296326418603520897402764752585971208784596549236643608069030136440978245983700518058529504872106387442266605375029949266894477523608145831820082622214875903691943541524151585296281852475306249358236163435868762478293884320510611519169741105028653490997809561403406316282671019232732725245007383669422150380711221638201220559264315154351495529523893393675765463390912463536872192803180948091842175874041816619389601900968297865166501432866204539144377196177923125673399065409262879213752314420486988906785196165145735463152074124299409786524061218183818312923923552926781671652565603173808578508397631494328389172407114888738171468102071740395219952191627141180515287906878458881365528313200555764699813064254417618266302155444755960187123235665696512244618752075011781128222274558077081754206445235185064952704977650926321468219286644718387744026351916496383922353325128696813700538703265983865898599281296831530464817023732610545542023324613919594164481791891094538521274935286280179979730033909413097060145936539483707092548512418764888459318378885708568860687527549745758107472045142760684673626230758781147387116784272144428368469484704248714245710538594813611228728492406459736391925410231822259333836195482958781395001000773267601759388292137096683186613514515566758729830564810169144804567346426873487348291723531044281426776374837474131980750186996145998779794573712140524239197532134252996644992294782626700649326916325150501826170130250292310813678035579546273247156993356654844209933569631236765606230907487048137265984711035657197533261447401051668925123717711275598935106208184278419776945930147265329332392601722133303878549740175602002461086739089577819215048386978672726160015671066802161529473312850980818324337849961384810346879202627886464896494484128373017631838367601708584139990047249376824867123029895390158544987987349566797644082598638438683460974408590794661234929846738546234781740880985745064794105225402684501167577775265752529574382095172643986039402348394943305686763149304858430232350220252516806653941019298315543361309005300201456768417736657094979370234882730752090014124260233518)
 :Q
 6703903964971298549787012499102923063739682910296196688861780721860882015036773488400937149083451713845015929093243025426876941405973284973216824503566337
 :R
 798200462101757383229913984124724948838990872653037472961318277679205190038216777762367335528783963020158510844515568516139906233972371567943107084529598949314232842994850059207690364063664429482682918860596309306476407258315779416526352693287072744394512002494079197235552232186581597822807629328700057202776981540200512742966601573286622124860711971518229031645137471431786467836040192690512074660687779790642500086083921660311778621495461927313936835201678930050990592809773473231625633440484848010532479030839989418824508409243066520476975509620996809794844806042739528763551770304599595809070212840067109760816125756372857803528201629254597794675416138540594022663487554536094798958438956317201080192307975092051883682225070002565827059788869079039300366019707625137123309671078890058435975205204589057599809462626928278135375556187254408719818826236663739423031734633140857923020815282772016286023813495319708697232522092180539748032778414176839228795778210157048121234626271840937996965213838222332315861344909881866792701740400260095158570222200205737544796068719213748408895470841152850945199884542892505579278728890401837278701416162501676713920440303437462043848930433290424656051475172096188931884946093041836744687882969907663165573172631026859998996412465634187405049659165880880859592132294309484746735970974258125343901516756301611043065310945916858352271463307250616315284354783298023164073233926894322007796772702584586596440877200416757251044035790380582131133270295429007394942950107007795353748639189605918400509233417483062341523629386495679951854832137606077800381563202598827594773252608852671411381892651548584526364311702756281193095523953708084583262107110629189862417575033681168219659686289063714149841686490723530115285721469578942985254794284923999543314955398342930605246503625342367487943167312893917204606068298300562073485617967844662082047739891963446510212665193752706386402264817876997275683772844848184354808488852620419300082083374938511748837640388864068355296025658714471303334879930148834565304514573153670656618656207378170667126796721590855360992466258200177389051938236792310999983551341934383661154317090213722
 :P
 64212710912710728528960571904374093783343775736116705867217280646722115349390063979685580115969982070407884999502451609657849334535896393555295124292499456558644871499017630001364309591456667300293590289126095632245199671837422413743803661464119109236600276804481418832936919671421884367207135972833904659779080220990027142645735087825566905110420813816073211911794283101990645580592048585509859593523377031746430313833318341240239967673502322092577442852973945118071085546442378420641676475187820686394741837821254841635585702647579835284167587999558537240808009890877642852859718906716800888017110317958068203115581961576812341565455247698611828789086367825261930605582510055910678995124245788406341953481447192895472964744480577711394916733870349800123393451018232218919105669884420940641947200781703630335302858844081092895394397901233455595509820652097076542846315661534834377267834475201902644665059584905065442309365538086367772134625531002554709211267649453690326143583777278486604538865376759033376711305401879670174669647093455554676519600990986779290811573677024099144103867833822560464625055417769686490734345141055564431070298977152725103756795162334448833308860295929810870411125889858444624381081025254274198293730401881790875881528785548429125864991524147633974958685580283924984254818642083723569809661307884688368868428945002345273135825423251023736455065533801066502445469329817839559941853706500355868737688009484192705013832120389597058617570996681487749994666622354877005056871793241397286347727121392817449479959179828781680516766270731096674377570671205673744295396571341022477587348585658909895474948773107546732016188131105826014131428481625475645151581957574501054013986250331881195856285327056830303506169590283407731104334112347084395744164930749461300606971041291978283388138663535041540070000537199711173095723750483996803337106473889043787526067042023677598988365894058082394742488398054479613718761883637005576552922988429432633453236981777592495295914393127350975169637143433130585585340896841385834436694470252535945228793999232721139357902720893312796460465631339233924573578225202824672141072582228936027864556736747114367670092575210853320206872334597664382705725281568962922114717996599337449458923054311800030419370843107393271530837306993094636510758759858972206416115767
 :X
 22669012997977835235368112152071248125342352847458034589692006970857401900771896132335789996866736539892778063283513660291939475845355658466699626609194605777500875768799050138725922432389335499111103530080817587279149410765072552872066623977541592754138046798181150184059082079557105883179102346405171659506827609143995971490235418852030638320399248476642704049134886842189407174360655618866477235195266170607961053010268575056190539654679337284443789551370054211342063561321610187992563753250975285110214215638011433215353711684000720730571763909997943333935126408956060459013942582474190555513774094793186080707915031114482058404684439827101879406038247749149957789518421280926132243754287326423343282964051264094430173553316515250690587061804648725241355848145181228853521225497582715841821458486916413168596820381937992966608702652207708066677087818055451470620943172040489977791473002816154506002463204745728474391096794348205740982374357507243111071596882067637515508774141666008882574108292124327017439264923278491488188449014046213402139597252883707819053373306719804115919181120557468590170179317852760816155364879581429141899344971498836424378753336656819205743506523794252333433354024228553767705642475114156365084047677992867450436653831753556854636497290044640557850046065066934799931691351277151962583468334154155663164780674259152792870764259824562730942159916698458826953141758700605959317125780355242107845829539736407911868327293659420525816159075826575459370269169525381630985165973048628579059058156598653027094778180702968579479363635124422327274137583578327014444005754627919779614332879764583079368363613646304880990993036667290596266278893410351586090817159503885790103467782422589212748003830699706689714322446321036504757751348895375980303303767174485457634203261032708774276541693148216416326434864341957106733023271045711667730079785340500397308033911927756619143128575079683709682250360533021616947407622165434062580470314576640283502947940927792872209973949340596370606498175555930739850502787620135092195596972044715726168152710035963482956847099852797380254386797719479173983204438571651114655259269424416455312428931701171078278251147931736663042490221382712928746225955871081436697536383381325610642147693994897363844853534053357902210379991541001747981553678301370727951917953
 :Y
 38124725067152966203652240935709905834968744377975169120579707145661154699791432056717369251058991727354911445316176929325316939162023238524231883727331489684532697226108480897149048667145519496295272230395807465602372645107348424978323640945095215239014727534033369225758689343142730415912150502226678604289325715235449383315478094593705993100021496145920427326978766598320664259827740307343349934432846397861492626964339776490991974112218032591860075202606702313860243907214767883776782625815604305333522745871057746675782198179481329407101916341705709628615524045502479198593794096374414935564085777131261474817155493154563792607703147927506825575463509692425097242204749528717325049411804936015261533688194792076785850870092194116342254350369446316448349687581058770716211059506226107950753367390068340943387018640821699826874034994032050384867783320850189963890788579313006003772741397736229203426891508298121857193677854093917653763400433885537900441180143150123421719532478528789272060189864226271776521862026553223007034133441863851290584737103981743575657902424489294767491036623917723191856672982262551038212843404111177373876416453574711858029188309045326690023582901795783039983814363318122919077211298704429597086202519354907189899606844071686117699267966631647210951489632801723305797278989157444023740283797405935727297404187281380262153563890968891017043581651328219321071173821518991202978292103995890004737839586818314566297298498509635967232932402498449820665270561106430474393060484783496904136154082452826256414010126200629285767652535304413366768362583085266647531806613345128611995354062501599304813717270800529241385212073225762754494323281884314883260592096212901921861917254681550927142271859896706242674327954948484713230073515571150595978494002027175093278133108629026722702127095705445380129243962494491645671878319071616092761117614958904956614053825798730733178702694292697344641104387834578991224160263933473696196855284548667939471178019564278939997374265491743480172454161132423816414489415441678687987490525473422642506826805929731125030887927728611221408659715329049034823000723178812058195552197003965677849738030604307094371488988708882628193835259268254145670994994337893573101151364471531535427925379281865841935026429546043419592828041481584261646313077842505327834094225)

   (:S
 4906259170875901780028246630020944732802568312958039342544639935413504834012890478067887672399402994327565980601920901281913077797669610341991015376226579
 :KPUB
 (10172428119950439172330992528612551683082338074385253044052349731735148116327375968148243973786599070636656377140951598928636120215935855663395613106982707059482476809282451324252044273173887129407676780489564146807324960386770346349297072865570642380004932003380253151771418356225646007083624125775042677993386832287017287743922939311914835768420109650072725639193605137491659047874681581109491987998009478347116526596782024103972991207733282565053787712101580604662132984455431793298727539491530420862758891973975667330964204439640661633071210105646380674465446791170364587446885293175062113091209017180023787101870781489913727917610643976853645757694615994943392481037336472923633182436755074110956573448403564348305257133810676427076212387355168142441266759069718602197796270950292064092523163195950012501444189702986369408039008027495672228030627396806440679214958275899400357243569235825115894125794901931188691714869154961180503244535052577132663042822333208116540691570457444389120452701929952591505498964379072034464531709073724212876652985554112992334050394860084484518808981170157584511191641756910119593460896755296160981742771542397329605721815634737703986428403251421084737927210431915023709828994266933643482478272554198800214447699809205307866368765885663744054169951078164755455013477388442922441599726325765429667285037878894739223883291225940260432209625795342433740412128710589276195125148103737571387956155621562802883382759511835909999044310346245159876160448568356208836385134301738413142287891557057159301404977789229048128666815776421515528313833954647809037873069788497094470802905661869228662799497422230680170352220910674877436430256089194042938143126975557866394102112322805058392736364446949976434384919429065377377613893760524115616552902599866790496389907697243479989330529715846101589689477997337644899640318655097850415617498195569053863843413075868940692938901693809961366665600909837225109096154122462186010122475656361597161082205837601764313129985771857488290180011791243872617683055582972479200001305632515134724094388912609843543989284427378613548385720539016047691228778155740612954454956997681376434362218955696719418229886795138031350358183387716363731653530467348016413763583103590651546351652107600527093004089082290327750897127533829719701282016948444509875949051144
  16782461979738525070608736621621754854832353491517413349249015758571964702640033406450939657602741391606836826122953646914252877338722060277312008996424288616370977985492885027174312430682537300639376908356819768852572265281932792042556984573481674817121694178395950783011083841759406519520510773741743513642219470939903787138311670286586609910687731000607445112927077953866358466503378711168183549927291031002700044395553329059119251870805049959951650791207626599095736619189115255459629722355034745838793346270913213046811283380595645941086998402033359868947936654665656925781627364581020799516497107003240804322901130901272119612445984796418492621972013239657946907323171462694619142820532957773048950359154575044708883017204752562667138443032411158194434794084315878386408267578801088906362380092395624027984915858403142244091991567189691298756404188571078144195717468990095365902537206546207675483280638801831882077444725888423369480383490673380066000963381373983159734545505270673850218569327446352995035110728906216305782897455543703000209854004647176057274023864897119356243930114107760473702630354084994805977219781161570621941703570600769211696775828360009780441647541173140881100830975463202885465126634611066737739916091764755607458183770887021489597665780216307271253087061802100720625077944218084290219970550677910654247189190086229327754369313055230990730404306613776745825235855464251219367963311213425165053581599517981660872653288419141580026920612096431404566720425574594294772854232200682388889532174916765361013106918833315740920598996343237449929063562195590958884663160440388802672390191653146612532126141158376083553849999000634333448603190107033173447528971756907754550927053672279006517726826476685624151708462643488754345389828869067993033434397224859123615821751072784722828535580195203986494618242250244026666874262789574617547116748542194356689140844957336632575477939757217254158506414317710420088237479130998587562259739402524382997802593761526211009851928884526480195218311725488818006034117997748913454042179269627067656753081518671121215683529263527640220020538529240903588748273233668886710188477604764327019362399765664629859036693710956037579367763386132299396524692605331300359418980023099920237078569628986089422444171542595131333598234146603163084921883253907255843429376)
 :PGEN
 (22867478449658673986380550482391914419564777133809356436059120924732776889398989605832013886753014474033958554564658111653935194721251917925201087606995853515349130416962713030360267550837367889491300074158913766066767280407182801494111602703730195662229766214317302436780825991754278066266089800467885770818495172257429679767650192338322434696688666484734052798308294936545474886599527964534463069862321452310354726835210260541554726687201908647574783469820711066014084664629779131006101664835580763013151316881847175466952748868503087838573430397979633964095755239523032796837015811071374907558888774557151667859738663147290664592558205286825754928351234549962243914217016948417288619570541509839334013679274223509352864507174966383359082147439896479900277538154033993010801882843018272673526461361993019509209437486725665553852376378911358947671663332897478036457292270543604272985958855118852530187314773641046072656427130598954668992622170756887981908072391738858116328109429715075885618582230484478414330880872851865395164184921485688665808203970759873027641602177911584580180802237276471046397294932049831298700700850300221558008849889118905403515550250143098583178339056423750470918825986495050923476666622645958910198962264759025644793057380214032979222468313176298171120544917598598524229200673470133388902907142850556901075829420506565891658779691083190326095954952946867419580457301542368593677984497417651165854268794269733001362325833949086316332691720197893831930087909410762641929241724080518504946814269238508644428328086873335687508640335315944193045346648837664108416873575560793467656683461273426240357728870586174267774096117863933392143991173903798119446864956289762734101435799168506449601511502751337518140271865070723304304951263612765824567392827466675202673642711106223649561426815448128993455992731399708832887942872943498145282283855124079844276038104974732126298500826550293080548508590952912551316718913062683766251678399599383631458132191660017297926653929544826338186940854502271921461090174434065996408173812221175996474514705781801056813411449871062479791315028064811059355945171957611091684211205652025786189324359735880530083148831753174524785833230002712706637639531207082960984322571404931323244414973626882349183064795092774542046633344749274457895216636791500972084979217
  7198022278790460381519135176573461761747332060780802413124876852977604538892816677179580008738606106242635939488029775714673863018917332622510691007799748995268004600776689370265159335689612971263898024711544695643170886448292720970686123561264670049472080585933306967332725440149212041443270080040756070447769841049975386446832474097390399956289158298339937989411865958102568303875079139330096080261986320178764194706413704635566861141402743320160531379860101481944049720478522566039065040409507600868078251372145867986559746684965165930445917836031695620083722306376531121075713676970384682017871707569454105729903156554707016127219336844451041106064058522392925226766393091128717938055761937136026831709982183288308933593015173711716630556521938775523629066674765479073073088015379823592412116389060487412007495267317813496155464257501119795199061156225944505613544778957166107597152891640616757371266821453593521625088471754881899775708613381400748991206159152086800430072719464426045289145263669810254432800323132892420239088286045260139090002886178498936496801793224104282786001882551738604167339030383354618234902782011176472307508328972144627258362322274038886641533868494602434495244690778608533205239039487737407800408484011033961403122648525928726057639954959944451204692344212679034101210291276271285235327490869879124314835320221053337551156405571316469732648930809775466821905413843180929018467974531187035984334688299093142478465829407399819634483607572710945484142828541240471410004000484252475016517262673670114001677313048547474891275483985576511301484636112844016066191885746854139484879486536908377904611508477206335663823047714077922195046228652962446742052321155624512643412420332695625088423615800990630902496281654680524673116384321593283104945558915665981250385155895542621847262029583487443755068227027633193500275919877723317682220452073410465386777037758035971506652717717958737197454085345414416020629300971323126438935377151444345217959829246739264153059944542072645811896788607843671378113146677874544117954557499385717698536989970172355699350359127442328505058710311573265620283554657492030493938335073918502857656315035545762205965317825615124135751142136429514312806518915254986487776686657630118496174609117724326657621369176033510944892586602507852256000659148362701022977790)
 :Q
 6703903964971298549787012499102923063739682910296196688861780721860882015036773488400937149083451713845015929048641535029815695122901848427920101491081217
 :R
 662216746215867286018704349316623786966158938359612316454913743511272658147646789462051127160491643831732520663627415482870980133168982158538127650054706299462695341666853806001760300977156775985364716605129968518874978317193285939995960980253099780228296321852511434676650358851708496015967218732113155901521845526424842243709519232816502106558666884051955958401078598272302512921403304915705406355824348014028644312038374683050599888382880856031676732683773682262228089672548694277036820359111888933872721359864230106754986071346441746506412488428120868568924254649419953898752988393116172547311445320378339902418062846393760550894217666536925829420031156573676956927404860177331751149852420373406626945074033630067613208748073073270662262340273218043752700024611295591675145162233514382461630140900403281730438124662592719286049173292115089593618458021836294899618647758932230787678515092508097111995970081178533986781523767821605507060985042822230404768108494201064588484496639012920391600159324169754304582232235473672078249481660959680763847057007899274996593945444445866277121828842116157828360829937812206482951910977096064020828541929636053166192681506896884483702551530055719272243687639705631924764520461911112257330549938644382975636492403549369514100941351678832489448040886833393310099517416248482356008915758028601180692575171779857132954218328011538370062619654385670096600806122658621605842209035925873952824170218704169561281336287026263717849082022443698054889200677118092379841228659268360751644193990320872330030457919183442440180719878644243839449994726179927939251330074636369569160804185095652433808539213556580428078413346687534921219144478112873008957255965178011500903158342479532183414404253872080683604434298738359320135470365827682863146426683901339974174813795892293117721143078009864080518314512836373949416583450626978067206446757862498480647257406061081344843913738562484745386629714593459340453020667305412205215744861881166671365762629333940461052043294524860853577805152883458593910752854639963876700095886629779788237002344347861380984492467082591425646777023957319375300254797050554425328870064857544014869832676315878
 :P
 53273249647523338364194318291217355605910476011756436643571672840104347357456337121042974775025484121273067222645831015268756958553025324669643033533838272066243597931506769782140756978972955190062252825074438907443057925002129354229006060594343614798851220919248641157320717411959730974392721603076135150732377253677225212208069976785850695002100323911320376494665101426980981118216012187282739291761084464856640423476242493463364267251585327153284881150046569735427713144329326897445421273130026745063859215120674053263838017947544229985839004368800872202564560529863826058583495139219562099800795359693098609029270067493512067031341993827143044309063224445739622981199375587412892287341364461259095938652137407718681649411600737127114985382176959362846691494690044899758891337227795327006301590077566230739324696022203147528660330674682813806054361425816434549824616767882333444016133628963131575438554003742509829387613969002845846997909097207424280107168453441830421321180271753270113155781872523568534149108953212626901083944859598751353137011082390709270174638817515898962208275246461498809172355680359583467328393455773838370647154469309834702569731618204375617615861742485761967007603070808326945333289071220525714395783490822329730530521904390854850129573120705698060398842398256671599647204528851148418565827523706662515930222610267788873145757430272034627165345398896425820835666576356425292537359855941615397911729052036154699998658123967499390579666566421155617852280299593901959314427541833497838728125638907502580430432645132411475756420552428365295802132654085830713990894662001989889898032321137920547443743713919765896647120399934981852658944602231478352339970028885653474948228514051352617688040527290838291860681539698597951040103180893132708083454430296148638521555381560319881318654943488793379233657023036460015372332525713090436462455212770377374858397633201392258279361422824067796948352753752734700595834320173669654270277947178106725440912700973426956531332014471092766466374614554094741732298239273806705918161138333977656035722506366762065342650223248973011814955704797412441822190227065673082191848315478081411842791676824020963013894842921124260461071556912988799836609523259879011838866528991839616077624841424113875571235427275770386121895125355384478221176940187222957335962311
 :X
 53182487010766210483192266447013209924731111915984520479973288087520879144184405109586811434165898020491117206924627744724275300355268247083731372740174541144195025122700639538083203601628606227333304066554775843753852596516621793991266687049266777915479613264647253185187927429464897411095055155486384552507018684012477547091704495187834644891861819859475473744983129138079989580033886502346610622469243301012010231198350881695757159040819715313764960948769713647304256183792063919180375764588363963326057933022547818846767141231991320745490607371079959030702151942539821768275242628864953942883555984155251851550911335227632709713079067407571336472822717032365677731339008062706513698844354928993529603179774395932155533316005980959545598612770064359753536060943157762519544984610331388034167585037410149252945926488140151241458749592123764669453687542324160551930245519734974955379826962576909615654653640482014403965442645161844605857296922115858871146354099974152316917221984183169565793403127476760367939765382173780951653122897541405610820266897896109248770325179223235599503290528233307081529596711343574777041153746684560895384229605653539136771607493357016268487231971529279019814891735515833849088528163849469789881406741265936814921354985434811295863189360526538005952342722412878941678355056222205237364845955672590407233038461666115126527381576042453879176658856109973502052116471149748770361490046067824071217040363366309345957175268011108105814545666531869400597398991792226975344212151040429238659208996744862154881093855219641711429609284905291437603768053767066409009309990887904088135811483732498211106720316727153068483913967294290197583167229346979546436695630034579740549298571105317987850546305736362159976159516607328382420789298976343485453367757266772253197708219345236292978757457549985628366860169199967171399371477123247708933084882877802381155046896911167881542157358950038667280498433860290058659238122167318153255136001861100670331384066321212572805714079930366060843905353018956669385953853906938700685960451120773631653822304748407109716928602978593416250574577718952608336597534696250173126464408724574580188489072081223396842220350745216242925830961400905351211123174324199192875342997722893104736468974650816055047888988613672117337538246210054381035632309107854325269896173
 :Y
 43203776844768461942373169035825554970723851286583501415711400991080261282657994487744764722493158735518894546447272936057235137709264607767966040029251047624015605803401760150177861966992761934319921362270197396668383965288628502997050286043874124931825454650841786148174883695374911567584054721464716524520106850607819059968326495760750057393666116890448989432550897839806457863930546912005731640414180266552746870974113101897355881026323860503306461163578706610349686310080001135087741283269847117331772253504633118120082404688861672633273024611358288930248831890990415271668404783156316874349393350194613198445819337721531619638536354147356255480281317847915693610182313916833749372613732185447923117375409696112361239338023804351830713073644104730374497397906679209413743565023825460338394628879185785081906801695617036270138262271151563085671873940825504485796868566298245037642123529847933067672208612478342329792903004245014533193588019707411640083063206839832579681044134635133523967732995515700566485778433226616021047570077641360033347565054817173234851266380009839843562320141034620146288693613870162618447130568079394118395495324909330769785841410056913585474035108636955670856422164681976779727707970748418735623112953270663096148759447474223608166338470809491349714305743287206092039049613083145806249085187722263255334823863842802144027336416811727682762690706236730735654236102810190513299882869345155874480989436978086157669336849004360869047086466628664309270489478695155738500598416352283446058367003018060084612550514691156834943818329960361802475176326008025345480359835835753775347520015027104127692357631883089664243359487647912904803796417641729380995443437812329245650030370564847388424245637336002562982571809206327597155911816822001805502995227355162111015907896075708678606056741735202627324824026310723579920749723088581665671837024506776076446841196524461447126901911808459359310589630358786025018113179669436908920885226008782503304980358597138621045893292149343998100719847540416189850560073013782441283456052395273245303736100000262445230393162224589226044271797574165799120726360329414114894533878641008893823027847325987229418794468334217151737137564797810963537041875961529063295167111017846921675709879365896978563374754587456756810250947326124988962116475307610050585003453)

   (:S
 1241107032308392170639363829468263828945788495302528640040642125016557371661899520843810697796034574648219586932414029248803435271741199718233623443606353
 :KPUB
 (5348892218926154829416798880079949823994504972162897902160286343070274138055344060729285728543274182256503474102794072166937220891257753582520287867705359304898664868137854213972723978344038822239986158587212357587565499664039953692876640858316612320432265794536037853801672675562562215745317427638827502190854976143284920678456117733471986205345994380884076770609805673426644935513248756228922869517997240195688166929628133092787628007868918592985380546153834250995731203486498753820940594297820937284946252351632582410489459224811294190114141937962524779241324615146975147725613415949418441530823723685697233998096166708536877489807804397752792727575431302041073563803383472496183493924800699420523773951678081545009897224805715681886711774128761354590438927812111101202856733934261503923943347823885350248930024070084664370813250191114412028022189655571055227524221814168486932276662559886877618887925576046669027102764986820292444377905267215709030915456813144971525043688173342247324002832516991453934047553925345119497784315200162598246054348475398908097350152279657418867841156291558632396587134980490186829643829904683427186695052430789558295076985315519348214704723115424909544961759418437607787760339292439368748148869287064846510416269071602344044490894371023338478908040647344246236366577067002424039947550693464417973055589671334371541906715406986851999399756850979224177616685421213051299085971435291782087619197073524920009368871350953735593637696139071461258503788624366687839036520499122169306892227146708046979594205970980638242053652513095039839515657744438378898912348243000725906920905925509491381876103431066313996106190955423604873701058856588005891501127035154369672387034105090685206721929017365795690989951921524762145541466922888834188425171216512400837396339662063110599513057229036004997625050234375229356834907463160488533825739251498812094975362315911925504827675356181077455107848887397224961122070499556117501491363405369774643089966144949588313754072441314508352888908671519898779859920225214320045600415046695207686446021631851079901947559770413461834668029949056264348950995096762599957675425444602766823153356381183460225773921052959967322020537828209609858223036733851438723679995911781776595005140288144370406009303585602156833424448465313283054392458033711425134053899330
  3851793080763169641487104124968629167264583489900887618679344555223140530925566011452952698547124400698658644048755588860955562838993080502480916989967076669201950978640567364615899300712689953202379129060338099067353215415261485494147388970923168660347436739192207088878153021788683584658383343689420692321897388306508930454571135292169289485083205684480532870246255492439971593198808305442201791480827207820972450370051937240717237701451536396739822670188273916299451054894408678111888695615792629948835989589497093603386108212870258704167190616572637862587549354478069950691845039133429331685316953414223766363218190999584361212259000860786768812977326624540743039892612360185884503998197704008478413418851955381885388354839363662541714990576431338253792300258342848436177431714581502854570945613181279506471627912590720039873715607367341678064255411840055006890590717163425028561618065389610869615973912215439482736070600042573269426670024447208610002519922994253622539971370662514850015400343679057560935301798281058573091584647722091784500943346054130666683031998436812351595038052779110934300442489709112191060650789054280794119014836699130450192952670720250838569173835751798471891925182489492474049923548009225630536260350659465181139388858076264088668119018231918197689644565512304335742751961071086555069695439698754135471144166164401779347421100877903903289750645415854999217264452119312289066982248778299266439219509492641061911014886272218624643290287739522682793807240645341740525026591190119371608191065847545773971533055333332846289495480842531078021529409888778189474729295422631992841682861665546067712408842237052932391597577166093808215735960070816985379238374722547370919020545896813218080593599120545733285162183254388587924441177175438625579463651525970621920347051644853258324549723443555645166239189100298955761827094453991248740782985948490033200765479568592164181380364827952726770921824857774070428268240679592546742676127064753688414716595295638323753843426341890455077299136090238167608409637300830096708145526649806993114861741075110508137114372203670371679285057590796867704488360299250426590862428320991076576303567214566999368930131827549216722349549631399581260667138583840677799115614787859976779504228443324747145307104514404176199383957964558545615119913946281688843622974)
 :PGEN
 (42921024486748404348907773172599361597220779692726552425469788452801454645864608571633055067574568718669266706555260460195799373801770665849971600072268408155091970492045056692582855734921363041851966375536660804927250211451164573430767287989080044009286204548980135921378267910592055787829589168669992603165677599165121203749101674767001942296124884743595102445874099605034969606661170740827653696640035250837411914823308080484788509345572836112972990650542060039295358144854998565948407565446420656504553581463116535736026845051282783109966144444382331334301627505253508639142381160134724961473308714459744754571679545070731193665286490111521416331622388160292571604177877952263601310718533829173133805242654966731328444856300109941259836892419473260176967703038768584202366636497137484928344023096764139917967915515113891104300541126378352808441356403559745158500829112487051094768652227717482971705031219110675650227823900716483934660381484929642354979970113597256824627980752423940890123009539065520094253248758979934921546978869644700705375106254596608965942208135745536664138045382973151532831035491047526079108378687102069313674120862303077042746338059246589599078804769625905687231399409945369253432117927756461740072909349556773588573233281808608105292843339899363153505168934738809232740503069713277891699643986659164573115480445250079285157497108279825503906884032399017358662257178060120832061020235380294495079750220001553973975408206513706735209889365796774341108920757860499917117267273765064991267426906525674107430531029326825327851934821089875159565407471563693874524297088019831767101597147089314114331728060533732891921055358580032976692022873203272155415093451415874098152318434305034778600542767683537520796806341206573528366091428309313942164927923808092265974636601453868990761848589038654835883229327084212636681244821097952831585023639003349275408226941058754658729966934420139980593995095500119239067351560773591157028045486912659685984196298338145571284652883859979481718202784441777831676705421943666658111003164626473326729661758928539426136452759735175782624370829305024446027963806160625023971442847459800171193153607205784170186646340064244369731416744252862928632098461118099872476564646250490904222614776405817312133648289253267623501326783627905616072902806242157323832372097
  38509203422985780581921066740295794415504398071159466483688334365324836396289015707584817741472009679391550309652341258677314191761535479625199083070513690522284722129761346934699833472577542528800482149740354564800056740313062151612750075739030075530326743759213167964434728324492967870866072321659466651676251394909457952627931601808660761524011140901141183019513106496855724313237251979291294866593303778864219051287076628464555316119112678284044898754481554757077028137345111433574728575958420400559680471193675820966501332164710828531582725905405974206880662919573731612450463853940020923429361487309165494568628707956418644618635118951306228337158061464927589449893857333968190343924819238810384258752719454944887046432765680083653864979846040568597117317180747413800278630026264998532406788885185414260952317125037119950905479813320422589058614512496360949638665094168263658069008310361490702682619891653385185338595583375585131123604231591545475607084845727922027703562865198170695408688853994379478049563607545738731796309695920745367337607598297481359889134617644938964910292290102638282361201354644812751594468459113787693447744249029855088589112352355885322450088689612512815869856808732682015037936268695845468256990589011120725660908867210319311450923315855963087794272044480991499775197613333201085982285165719732306020352335722162146100603306501161894235417703155455812600708397533353117659771961487104404117307267481436204466892912127821245887399124391674093790331303274741971490074933785226440650295936726536453212888114059860427390851147915951155716792408228789698200325573338592384800163677596747646293022123003616617107233415788525567773468484695026451402383828574367681766736216075212022220786916782045723878940449985260830928208012120814940439463002742511495938445170202874247173143627211448371578192427510730544846758463842178488730180593346474910844885531988010117613805814459901411063760575262014829570611783048291460168306102492223496201772151383332291416853836071567588994873784033319833725473581418255746054068102846749475336661898826956101078142380565934461901013763694050917961220725949408643991842282120534016027515558547793055322095364181019520777600952810307259616822966129271486978864226457850500369206529722970469111134503215417376164545002350972207242225242092135107748411707)
 :Q
 6703903958727801449155028036339728604153350298799000403531838420142568095786030010761405908842839507718031986773589163184063695615077333614640253890461697
 :R
 586309679859851810353549839267997741070437565604545316513376365834665349903876299278034549882565856406189058974193215414799244261896373467981469294164708193064615091018903339291906981569145363896097184955588561562148258311086291773880654278800426807300345666127579530602153785559607939027857667001329954239283059265830443332744412112067964564035790396484953775863301627725293252665917020793706994162967909117643244736182136752200018294677778111725980109183218428225692368235169857525632512554410645184397247956182419120919701543974507033489377647099651056737510068888704318111603438906965064144059249214734594534558792401038747461881499246448508035453988041259916097051182415405874693124972260207873519504439266532754008009181340735910374750210611290996980207546213446075403990139867772109313461562619773711030851344675969302561879230599890994258765809473769416686206430389715501253622687309425554484161797458419212599144795223246347118118213530513520608807606968394107148792652892366643952095074580249094000932883746499821382190429975976857378156404713183575127865101938183107612826351689733780973705618508589029148112439970732637876098891783988452827723993963309181928080146341470619788883728602462589002391273915561341870072734725521524409186324097788541700322789395195246518983858504321653110132801325871359500204718962838676258605665857414792813141918022795405947173218296664857619502397098670413887947913816805472521113370209778673211420758991421490432543694049335737151694098827088117053477611713563279077653624796794249128925941931091017837405476444254609360437808906252751594887536524163018178579748528417180845479666876378618228214858211300641319698846344670697337570154759522060285664332799388471410480816000683523296604682436806042492877783152560169757153501319335206896155591853222425071241787862879671556839877814383577311901013592282052739873432727923726598170218359114336515098761420542817966929383602599742544312404261919351182674684623363399714128247778526610110960358891056493733493098060727396716967295687182240890528388772085102724505192913253651879032361830269494143701386702640453247684198363725342885492190232137921770580639719490750
 :P
 47166765406234685656538986196102740859528062093336313117053630753990786860602806461317568929936134561145808484478714628843372649770140675006665300238041325342064105830792442313170109653030864211854882027660282581664096114206549933316405318047766254843873051622245728505033666479384333428908221356313036420600276308248199246674322194935754840196992952267298760510532909891640512928360982535001071988119150136581062699687983165624673572862662471006003476961549187204792809138090467892432042504643908349804226073568843846438922921157325784815635022797843005112407316082684713123987536575535416108759844705955685396314687488922446202707698468257507974959422777152031348209775240966793714230679741501551837339165717930356811883011208486046345788196480042560628620484890623483316295035013671500480499800757191629670868431974902153972923999689341891847487174958322570875029766488034316840516632015125137225690147868365091751541153104226591832612076757571157711661863687323588129607406540955896576969578308286006912357647314535738845251599720812645775185079459557414197646031023405056960190109201926205147733636925589223349613081323894394847346425130134993818592598001542774215976942457763576069701726361718341665730462564184247550941805238008326003325998448568108243775399995560448284503945429140139473339621641707398121030412558435443657353745935330944756000610390140911804892845326238150847923202931544388045531691445247205980727418484891086411573203771189205173117673542179649329738568025819486964481180185429600243101254155421960595113739732049966348193117308409701979867516324893216577810466811891796200192229551696280208862386341600883609448348272787544185514044609265791690176009169637823610563001967839554430802389891719539914863660105421509881187037835853934171179936497396642399664582247807807278373640121090831069614704706445739261204269956648720427625925133979367274222634763634116993923776855744943970809468390902816176873249246425649313524084915056846640968184527554397403185325474647281116152393312100909387163985708575148363104536060154350450245683320655474526302783041723919260354729887144806416629309404663407351162694539906829365378100286639553078784225674997577406976780896797693759967883830966618222502208088749989251878956354979480972826159227945509495599773904788876864881726496773477046649632999
 :X
 8224237313967364398891687442925900251434949680426593117480278175335021876935569009824635569421316848022707101089153806755801738378674908440905026877846585472278231892605596664111317345471353338756101807359040527729005133800003482182067483627488866059716235603902993827083173364868096044589242182491084354893825530522434504342961494238804247984049936231948155332630715568275558753008939117159334254058028675871597191325034907565259444409229895379653273037185725523162233874375448456256068204185807319742247937170317780643046346307160133107500741744503746478553280010432896230929573464618817985180182661481160217835957100717990100680569226081822487509283120614237074956606543142854725055114905850585257430285208651662825234720283166006651375994588380089400722417862583879640521217548629180910816384225507253038651188130539863955286409540053429718179780210931254774712831638017926204784537693827933850252624728994972809488601119299733952627429026380830045862838245297274898949789443933850326974445498147829584541791775266808731170369186996133057940912914794799294429269177161526674945813625675859516603765662191326680833515205615395005371178269361447570529235773249812376312738748334216407776362375144854543302340584283559231099902905963617897807247257283947025623798632439429530995973039016637683231354670614794154748236848251171110390651081658620330970945677246332671040650320799665448850986895638078219998169669477962168428540750310323475420873273455813459238506340602691342996836911347495437796150062516631811035069458857657089751066689093825674107663469572015273336359173647070825745570506401409855889136566252093659697477555459846088757897801775615690768999812863069799779703622103475768188371008177582317984503760596927635576164631736135603849534963949589977239019279533372904967622149497280268418991431565019245512602479786276503605304622934333916094910651487319023636888872686457370691632654319938697672902394160526611905940572159748385050895292178730646890656994821595574746111772282191123557128835681023696522502369848680379333112093379938921368134942602858193103254355370156118298451726365733731527660933896879396420545114209150847944381660177045708692373288965911878426437635547589031429887577635441917176009131158178098346454430844822840283223975930038651246860344640731947749407338562629433113415611
 :Y
 43094737009649028672342818403177336451045085388316651686139726146531229100141527227689932694336792561174115986120114494167026929217343971356086723921302754315038311424631454435719274300186005942837030774061363716068230601174553183278477528028362266175702788577918966499155556879489086093909245215268423556602773384038000206684349306491516511253393089110310309759403560330287070206491616084006406385222010807471174403870687804220489811992985262995981511526034121571239566638761306617391849998990688853214401790604901088001940230852995077898658379819036711354495375568644478967562047523271408510234827919312829664204011862831650064730094213725393765446295241065550824613492883690087945341676220139027752635146662980284598204044688342803048506652045467572453982560274310402408389051559991602638600477167740368585317096516909357442497890417944784888167795818904164409227887332770075237033349668866197095473796924534005243601223452757002128985401634237820100771550669104046817355848780518486453269184682817058450265703654538015353535087112495332046600616382706557366933827437311269807494687935988862650886767596825619929475455934797840779354716068034541836754858544741005590774128617547457690206650386136262081082732567785345141119832686378626080710667686649454139971876355716090960429271733745178758321704993169473498867194889313803677334527913872070125364592408406269306718835371477555923659368088590567064114182059986358741258907400209163849189019872376517894962286144869883869125096127844526916978273758926686046616967378187703645886174327413270586575482728599084680770419661203913682164203616724726647185095728412876497884165196955367901469902943898704339751273202599947443696563960757183771051499742970767992094621876903341224262982190445644928230074739311787398909919368004553362101184274540151231202845151765364375058450911740092362582469211631689388483944432041954043445413580035813699062125781978698099095566640640294929333082900062931414604562259998845793984102793060368422494887344915435433131064352111418205793230612623856097212621626810915573183293163038976170812876040912189628037612939463712358415820987609327592129003148292923632156119789221298927181214594989921111984279652129077619033168640739011726375431183849224957119338804954612085888268478329535284678351157890261075889154285351021435400619262)

   (:S
 2119104511552241234709533918005029075950064293471791899224086950336071617927922480173294721969117463323224271232004522471568032140589192778611218198539083
 :KPUB
 (28838881787818053240501027175815395881068533224657458192450161243323602654892704537241845643373257612081181350269217483085791969127806991274813496048313965067275500483976389179697460260104281662259608511517410480755087213971571482177056258167996321267847740997623863392210046574774240141533583413764135512006032497727029113472289401146414340045161359305349502776901633370419423743211713140960031174344151624760662858400802378307360405243223993200147094746091726864140924603997686145512528116358669784402854044185466738602492370740175428574854267523548023745862963330015481598040280193656480289748917196714024809198130092770279830396966978361277487016200696067577101413257543210132655679150659904682408169555165774684148017008111857393956548247694995389608772511887334857801302313063889870319993828416530559631163303376215499279899643302732186138555312194427404857539771129486127336074243823680368212861466617455435331443891862236859111701640357235521145746875405447827932063247183582298915750705235318921375130706000486098423236014074739445697687196504920973870414134164799828282071099794341829916776683448004256336428543284914475643207653747861985314201999132599459990239223372129179764910199760855534131357380306502584346410779119154700317221443824937053060144010054637333931143777443617629365102444377261679986103783908561796150532608606765705076139461897225428868176422672748741228900558209287876223393506180547594257385738388444556896125061781467671766354210637209471005184560629927030823868701102174690235165123084761498846088481789731430411102166663898861955530017478201788215022456883020345989901272439553918869676571823396564807387142994358509410450698862998252438355883913320494145507960924869839898260199285263151655111143813776254366285750788971783630631740144491154555219092707964509597065021346883263557283473436132819072669383187406610343969813814092903458784427496096716126900784136209723348948595099588631945251709207604586520036196543502029076113117284306208697033204865973275258610646141555153099941035102345041748730680967713456950151388224553371684990867999139258765770238082439606458319105876612243589134329448222356969765494715011145210052999351896804657076103313022900355574639730626175502496050361689657624612952481728828712345322465516265928176378495760762762150327301018660213443303563
  44176330910256818308155090526196377611134027935518836375229148076771665097155086131847741368246287470815903137316940256312942174615091903086718733760476553977111909358859941986715103045236361145635863259139574470699729962186852709118587014514264418127914879929398053577560107982452235781847133926588908011976593565838478899859180116456713332097714992401055816867153695966151180055284614996202509418203208257865997838568235210651992414913969703512702753898522928259909125241247751763031134974568333368324080006211773121501383885260377125120277110010312919569590911017381630258797088608584793195203513507758287698743225090552607255695283256555532532763467758565611210055598577243563242151229997889940748852596174126802094743070193419913843786439592521907737138119283229687934157308283094099156880394221095400348178399659626017467111156227581701581998978969217210889318021022238022808764223131987174052952503674267477621359002818283146198455679438321104179977610287547472600725474385335446099482624187369196957216621134144395303715199153777748050783296342665288575307847048664484899290097974139432837330311141911927939210512753142138878724846164735845236192431712275217172819101860320101933819578823270745711247817959587431857373621854550072636065379845818669895345338085483369804355829465914335486041320976866573148071811173018612464463944238465881366751077165693312543884541450947329623582383242244132382018919055854584945991616820588551492293608836258293845148953450116427644896723721413955472954244481235329437806659936760436389771075297242534659411894084062247506390757920123747556392981762053317342228136453957237226681546020913999297431905234405374524673734126029630523441113357603209694439779221729647327455318359727019032496590233607129144515792562603509238823796126945898169919773758543918065320740481459486239970048382144357968127261569455444525046153014397959016013091903527714180352410696485625828250780554854242996346769523738831651558133023470142258752189891739633364870845066549597692076775956525279266637677299812497970111153857050616022931820758104963645781981237045533420249250258778703660499305745497135337709364965308559707707069626988765539165256341374963880859937705896612842857727440236235411483973379070335799462785670397565066661146189760062680497116355350247960846148534717638000732906855)
 :PGEN
 (36695154469647185570176340897311616108455899349009665875512323250991783024460398370953652265072530175851022278783482249886532820096713608155932196347968811715601991963866995502849936829591976085960383744726766335074784235936230778472809654094198088638869557192371017620867702967344923818512397243281574569067841087576108536067412674718989258707636394938775366654615052530894639477396999911043819635286710356053371366009658244872000935880790770747906907661902428311671866362314438964785968203927124567168991999638516552741074679310853377055304228292238102779891248301806194354081257367641570043570666875438336485190392588127902247415464232388866136315019313906606742095390670327387276277944195564689219022405818119175209950360396295367449950625226040320425128183382602846966419337409503064142342172259916892985998729343904387045389978090149611667885186638953952060230302952387522063520683613452113928480183371856723154837662237641801836169499740000475563267619789154104532838399626154558141525965132392100828243038988271511155721129759289211375380170708280215081043397684584228200611341344484684456737064582404296762607957082962853467633881775546381864718292014394413165694251351037270345539052140912928400929103449841988054661097780372458993974131514604512753758326722472145017851530775204779466793398801003784192731801156014193027128474109949109333656122686120977132583439541084538539916756564152502213351605841681959907491750163163261663543134694982318780161542423158086946928213185871107501323200942891417958706057590256082022685896844209500544557598855916194996637378483955196824416670480300085173317970279687060287776849656688646815093628737673928141229478779812370957312077564780804238326833171608154814416261657281705846901367265529451170105507128555366875336801106900373623785234391998188734724600700399610812352168972264305089628571392700405301066028298835905086658117225535120019665027852923451548715855823205529026571357009965348506804360983327425703503719260276128677807148874993750995316844619734980514132882495647209351987101261758260546900194242951966540462683518381972243535788785067263665599981068913249776842898185718769686452835540067348173865693978500991803019993744280767863782512002493050996633506128527239815573410885076044258740671177709392240850748529334341876106687901269413650382410811
  32891210384994662770826483486843706135469695384736750824945536206595107920712223731668811215430052948575233325175200223425850638068656371224413389746404035511663522054993957778834346076039661711593159126411659995758140994988913867569412932353465994622413267482142943401510846882535143717791552936686445587365477892258974037561375042131099708914894224816241858155480470736325159297020401702756193856647982041384245493361576519373107020132386913306072638257382609534477410457958374608023696539986469855720040560273156222651815983758484537432536693735105275706244222534321365991948980648913217645309114626397043454014536687372974413174706297135759714594616213381065035254153252505680729412455284613070446715079194095601132673676892028926113110770268888843128742723787095256069069720947540886030050192827959672521829758497364283467612812526700258172912989698279390713112269412692777443203849996546194857138470520101176638762771229898102900229093058083488428263472552696431278092308653644168632029983551894319291201671340488504620638386203416302247542244725960378242721006143270607901543820183062725702150201415769571654889202548524089369173934238378784731444229549168991295159276972929649163381759098309280923841513253654983461028362296110691163492540589734619058958876575930679023145812277570552902263924036610719388994012808757911446008371864906605865460542833816414187322355530465469622680844218986449147050084249051771940834556830787204039952505266900339773042554001162679274337196897593996456705487906446204655559580281994130524283484797896222329842327715836362114507675592387107890040896401302597496584184553738158377220765564178205005908572960717872781768284108839434226855999851800127768982569816877663603605925772298194287757349722913298852443961609830943741802729132691553123330727499730801272117761943469703483123606116919481182117325475916948246242117554495798530611248593373960117148595374517548655501484207798688633661246443159270692081211809329848997928649808526543078059723640998998215442403905335447385486107058006662564596449195550028180412835519009211812621601137464081229273193940257278704171597084530357035862951707639619210007367546492982014029666314492580352348260438816689788919027123623565396750581076911165202203441194161632858875563216643075155270981486769937410062470403069738411721851593)
 :Q
 6703903964971298549787012499102923063739682910296196688861780721860882015036773488400937149083451713845015929048641535029815695122901848427920101491081217
 :R
 662216746215867286018704349316623786966158938359612316454913743511272658147646789462051127160491643831732520663627415482870980133168982158538127650054706299462695341666853806001760300977156775985364716605129968518874978317193285939995960980253099780228296321852511434676650358851708496015967218732113155901521845526424842243709519232816502106558666884051955958401078598272302512921403304915705406355824348014028644312038374683050599888382880856031676732683773682262228089672548694277036820359111888933872721359864230106754986071346441746506412488428120868568924254649419953898752988393116172547311445320378339902418062846393760550894217666536925829420031156573676956927404860177331751149852420373406626945074033630067613208748073073270662262340273218043752700024611295591675145162233514382461630140900403281730438124662592719286049173292115089593618458021836294899618647758932230787678515092508097111995970081178533986781523767821605507060985042822230404768108494201064588484496639012920391600159324169754304582232235473672078249481660959680763847057007899274996593945444445866277121828842116157828360829937812206482951910977096064020828541929636053166192681506896884483702551530055719272243687639705631924764520461911112257330549938644382975636492403549369514100941351678832489448040886833393310099517416248482356008915758028601180692575171779857132954218328011538370062619654385670096600806122658621605842209035925873952824170218704169561281336287026263717849082022443698054889200677118092379841228659268360751644193990320872330030457919183442440180719878644243839449994726179927939251330074636369569160804185095652433808539213556580428078413346687534921219144478112873008957255965178011500903158342479532183414404253872080683604434298738359320135470365827682863146426683901339974174813795892293117721143078009864080518314512836373949416583450626978067206446757862498480647257406061081344843913738562484745386629714593459340453020667305412205215744861881166671365762629333940461052043294524860853577805152883458593910752854639963876700095886629779788237002344347861380984492467082591425646777023957319375300254797050554425328870064857544014869832676315878
 :P
 53273249647523338364194318291217355605910476011756436643571672840104347357456337121042974775025484121273067222645831015268756958553025324669643033533838272066243597931506769782140756978972955190062252825074438907443057925002129354229006060594343614798851220919248641157320717411959730974392721603076135150732377253677225212208069976785850695002100323911320376494665101426980981118216012187282739291761084464856640423476242493463364267251585327153284881150046569735427713144329326897445421273130026745063859215120674053263838017947544229985839004368800872202564560529863826058583495139219562099800795359693098609029270067493512067031341993827143044309063224445739622981199375587412892287341364461259095938652137407718681649411600737127114985382176959362846691494690044899758891337227795327006301590077566230739324696022203147528660330674682813806054361425816434549824616767882333444016133628963131575438554003742509829387613969002845846997909097207424280107168453441830421321180271753270113155781872523568534149108953212626901083944859598751353137011082390709270174638817515898962208275246461498809172355680359583467328393455773838370647154469309834702569731618204375617615861742485761967007603070808326945333289071220525714395783490822329730530521904390854850129573120705698060398842398256671599647204528851148418565827523706662515930222610267788873145757430272034627165345398896425820835666576356425292537359855941615397911729052036154699998658123967499390579666566421155617852280299593901959314427541833497838728125638907502580430432645132411475756420552428365295802132654085830713990894662001989889898032321137920547443743713919765896647120399934981852658944602231478352339970028885653474948228514051352617688040527290838291860681539698597951040103180893132708083454430296148638521555381560319881318654943488793379233657023036460015372332525713090436462455212770377374858397633201392258279361422824067796948352753752734700595834320173669654270277947178106725440912700973426956531332014471092766466374614554094741732298239273806705918161138333977656035722506366762065342650223248973011814955704797412441822190227065673082191848315478081411842791676824020963013894842921124260461071556912988799836609523259879011838866528991839616077624841424113875571235427275770386121895125355384478221176940187222957335962311
 :X
 38123236497311527828991178564550726089352949030317209136311353849666438676895977671375313997535589737693051403068568054726591850730471152432091519015362433732619946819445112192558041998282899438318458788754033473360492088842415187829705073797122216657644567234532118700052319737641342882005473918068162222939523301594512618176619213850730413519709796743844444803528684582755177621445930896916759109002799692160102653629141877869975502113289959712403510118477586593628795867115134881979511460572883904651471340251917203281725194222577322734955670673044052767812508998177651527808349065187359313234103458951206894856254742998328253440139083077874932515439985443760498320194634134556104577127958587264625162672648014995448112979571551005645253464583930451548882370458991334851976148174580491465207421285758716605167058613777096023312306457240488216705817702432151937648356829081242356793125338250166245522353104974520603033624514429508506750888225549695065676317483650018867778322366647410493148073730393512794464395655379094926665094628052033949575656554585725723416256302875941529035825898376582236511821642609486641197900063518710810219328722509856328289403381465878720622811265387517254816070654122228679363887887339712398595837872167647454374626238415115765817678524706167898242932640696074145410419293040214215026206023596096490237864994918522877297833540668920114799481820789710892087605344233358471785929065920004988486684637491421433601830672583599857752522646021473382945681200366419802321548223152194232228226215760079976073182373994775538455507819872574594729476600514751205570093143857290574703561571307496578172495646440425589984973969240862185876852011079930900021548242420768829280873291833154732471084140521454413709479492842887233475113378016751346968405364326798333708989452745405168149765025710824956711985826403563541402828992408318852731932753589235202031235203258029658412734941880076989752637643107159736520859546647985826754604781135014025548246741851162196143326988811250993887540146907170609858008684629595477220673775633782102530902549437815633368088701896768912610401426368765429887316498807312457485292202771822026776471376830124306694183587558020227546119584769480756092182398980104620957652610378991355554056433595478528110952812038567499842602533111547574701681117399253601091037695
 :Y
 27467434463807513321531676487289754048886175445800439833456356174650563957801058227119812834895956353164026674153788090517072629756041334472045716979363519139661046813075338566689850096740183826100516551226129149621751571431336636376113721688257770728447260310045139689804723444238111902700726115927430733454149403837036285895966379941372990296466152519513794161183527277109977073581490603063742612238698082360667980285382650813340898319227240566817399980553555984362921545775487756162667541225636172890902179190995315268101046133174153951545108119075058954785239239659688713670626699537824985687626286729761565837163718238366678953729016402607746098263687631438967826148229200952011666111995940422492178171628535213191035993078366855264445197139275106257728520990625401200229025280626466254151286155210113742218197247051111388646794193145309888181834741612185589799543700929836034068138675479997209928983946635343870675917487751685626420227943949342212210082182424766587517885516253579407483061231372990858215001825273821440095579804309443927490885933232770821008849083020081529194352877572117329912696822611850223417557292972725788684367480336339615057728122963610065341442139496347938514417371901626759475841568052882430254468038353625767034703275326469388681362142206334875341604402285705998635222491109506809531705927118387996682514346289148560390544549080804952296814279322474929836987846613207179274569343898336280261442316135043864043816663224574560557994029093717229649345650691817126455787423818989127908882346572153913436467564463550492360774951650025895799436576790403977736465584636868533189324613529800249266022608420802193016610825058983461659366791010057197123257260077350129061715039503933532065949654668229135127766686009942296504526202407704334631353340022156209484751186013305532405831523424054373584829404865651672281725146374229467412137307070472813223530529233521997439984203647845571652978294500009201220468830815199719245366575807983366240560737662842059714131545516405249668198835664394191169233898992971972756631712723224073946125507601846836614431153575102301995219934050116821997035821826952524131245636367812034412722588807349691121485993867914411478255774375100576993214936859251205766118872794490713780351305476777320927489969107884800243511530528181202355205354744849433180609781)

(:S
 3200499274281951223783073939838953238841709372987926963205818709179478852606553980166494161495082653281247254391381867137356928025987798333480519243798111
 :KPUB
 (19174104424389787707787532166186324911721451301054388682625844987539539724662116535913579461540797310584026407688242866905537494437302418478377445122279205875915261140940041616299957292721522109621941106981860085980630730165219777833433000122785628741167962227189828437848657633364778835600039240691152373957953461413304839437569920206100961277700428071919063127364894487523866520192713421601627565203903634737798914144374414576936850804919333501976287408689940943818033018625410724228525622943879490869317041283918829517459014544061307924439475069148510167486907860038413639709277283267275569552261578200908589996953887141492720562407654298034250149742405136229845650338704650030993580509350722382799141156937017969356974575600860736385016154864189450983131667781001256079527041350059246108543420700393598385846110518270960454110589898183492528133370645848620529538148594920733908798649595179891505038629772667720484651599413994654733765559396519143112340846177143706890855361547409636263363787971143878419809955821219327935313920535316063432984196305203643089921346388753690631325793244381123923426760073034330056521445192753228149145648900340687015185808895915194056495851101766098845856362265751150158465849881048448275176808177508041075193164840748645735254443102465104556759180638231148777609026325243379778188724926166836134000092140175875897578733520360338629406835254557351607352739463783115809284092664459667501127540812423561058366797407801103887570844234974382284127447410342414486913226739492433127978847756088183445198435422942896210984660332075009824658702272218366830364910921023978932365338765751899433902423463087527059351053745071016135876587858991671176778943506858001231639002764742396153496093975546865524545016433413820487482589530395546352653653751274565918001432824358282217839280285818275618823442018621339053532314789829527363539215557014252731841528654956316188796626469159666951485490622586222707901160535920440366440026000478532155207842335074976294802999569336522987101035593625212948894332945330995987863949775307380553789481525381961607068477984496045942564147105140031578634077048911599614776685824854229602968071050657383863323310373458130717245830959746826729967719340453990185576816336844296891451667713115330051595760795490783832906070890707631155226685078645525045218723603
  7034832722201443074564046512851124963380029323391472716415374827771361930235690775239937728807023135671958686949967007058292337259549141020746287270378746285048732541151971124275353103376199045407275627031334030542414536410968691553494680819318123161390824936827701320900342039762349844960816559643727715935899675082213704776542961872626766190596916341067399810832976798841372231871627180662232156196913833311259215157737688050182460900946042960456213096821665522255244767756792955925519078649783133033276186869622172743388180783374150442964327388611448866896099636147757605948446745020179972205610030271361105183930939168597372529431112252458422868226344895312153944559334744792678985742162102438694646684092950587539082584442552569624004514281438106787881561983394076905501757335147621908254403990926751801464038003089084819174903638980896502392275330568554843838983729829360325970094202426285094576556317155242601552053786857464079217304170240564267082078018433340954729758423199902215617574744143511679815446643451877896271379208522295788153067905689327278737064168291239612741101771697942168077672155233195432459055461226153664446860677344851204651486074373489663577295004921981829384697754239567806986074106732519682318183612427059561724956203636921586798517431099072286573269835360848005768683349078230313530840639091157876105466924176863170497679861295120462791895632678443960923734442827361434278386469162472810811461060792601512572618283096261214455516598203511637911064867009159065407770369064320187868774086035911281623538755309038039496269420025176587714919122136938403262199681511661245696263828632409380056310596928173585313247393510514663510992894359578447229663798961169709471825940355988062468888196159094039787708868540052472043276916110916811065701049809960347941042814128573244447049357531867954435712549003352942867876834922407359983733063460614808046010548256507050509882089597761641503204184749932809576622952853017109617065403749930415923410033211715944104503384491502337519192075365985512668756957028304397057976173456148733188115564863237738984967862651619947444493506112063835286090105854982771926910333780453655947487796971699241551712650024754138373622233215035482964146740667227104746428899074612470763916230690363435530055307027461069645241104241969686900384106984142104893371828)
 :PGEN
 (38935928591010420725977974990146966445832246264169141209194995723085156035561617791363585642822531793268122824413310535956684147453197016022671767118651550741170919876863266044927504700469700116737534905865400107220805131837412861097839883237791877257053390331865657776361065918973424419142723757792265286225895707455554639109653026347188730111346719636943376878229055660654196349971053619825258728916395432463398649590632796987258459867427754312655819718669750946264858503973486413373643862750830958787862169228829632490386703072815070871776913426762724762542940356183210688006276226820920336695986055245078268455795517344571506778904486350353544498581871547559892049504695383233822445161979366498296273870800751199617000077868190168582347221055512066553014162214862310973184535384944156717480929561065351837169917675993053321118092622185707472616547979882388759757939203174414492666172758163554502360457581876737483234443639022354413463780626909222859807765540789808212731761471976664400588073838855384780886571354875865622543829333656927720871059593479980498789648725022890106147541462844517845582604901236538147815511161053406387505479617660917567909347050292571382442407080838683990106155762246728577509077905463223274575317558803612228922548935267211085082811942613088729550339857316953010628433218476353178722498450329304500161125364933149482738429365774379259851491826182730611541658285700864503641713924862523705066074320181687604908791392690765047110859209753147827569738230060184293644809791713721037925605755587754279322711322706964646186358117234255377371686015939762861061424853580218846190220391643348709102418084903467787992126426043881122559104363023374078047495697961231354404354576312114727984235743150957763262778460449675632942267878796232805134819794287153477089002569991786061428944141283087689105919648599341880938303021430026424232233200466989576614785898836612995966912411403227126764737012124676475828208395378387045615318592748507219116190518462587262524021306472180551866234974971704968201248065707311620733935087026620134241308461060341989063514198428334378534347916014586657454257947131655830121898665182670246658769176323494477785932536934333376733646663291636358097342144813904630951912156254930806180460929287406102938266663588997415824815258060780389412629812568750005749329980
  48547856508650265331372478889399217119920901467863679621002587855681652901112005831324675179725032258102992834971357176463835932073028967941413188081942323164967695450646529687297301533743544900315208239289656437581902922536147413621768013131878810655259591279113039132781653775849106311415996943946515201560285108103299274076277394603152902549471221616016888285226788701470038548154947262092202749954795901350030542825121909595902735291880369143596721601069119673879253806998568750079357183133506648352280794499435289979235960053352322773392900670635747072500004841090418613035667940315300196097821183280141217054614783024829943391176389783484734951648564535570187192043564753841500478653249087365515078150681349299222143777288503935175117246499362207854882389929917815894955151521129065212734271229492519803968506154001430051836893489767721280228854881117741016463135347604964858419272627051660742348567053810701094526348225538652270945792075341393796441298753908906279720855062481654862068955767422514013242335275293767435970432730756336889174538572817536882929250790696854115456075031942312751789878930726254423648555109802800232390552347592490052321383924201583374490702226987277107224916719131529126024717073671732886675510862414261447641324337126033657594947903180679754940956846737362235011428326010150252827758892369104944356923610013472968842035641391889302093020309249569122733120904827362772480542285214015885277751146518515766409702432002039436060340853854426697318243253474340357338170969657653247966657578832991645229685404534285799863099547358817217836431386491870473024307243244088137876700136230141280245707010021104733921793230924343561901068120314467051581473865463327866287862743550191393712746423690822145099309871185251462211060684741021043806214456600639528969945339396525493518018487908541244542139829521503895504169272785791293897983349978308123253106939620497427411168181897663632787418639484471542493197471346544544285746380153359616021595360218052878409980881265486692453195577713832988526682302886955832802422143492628508721255874259070418268407116068496112673058294176277422495653146586897735520052781805604290857913702679175596755959617149995092722548484393484099135341807281309601698226606402598417366237434434189386012541055945238667525944395145700134259366353874539626427581965)
 :Q
 6703903964971310458312671358326217823860951347362487538921834222879981666972196863995033598995027490159190823395501172960030938471032548004129907725565951
 :R
 649235259205447950986340871250940345366606836940045767140347033383111867817386366120054143542129268104120593941203453478884309522004208602330439691294880923329188422809638305586307710984267935983394447847917310467393791654533338768340754570405372623984463025523622096456460410681607408413366103077880777603045180159182192632124357852341023917285357938927197544383334847633356839097691509972445666906418280488673620525646347115687853885707744282642289523679743341234215791127063873278151295950884196963716035615128816656374845118314449364018863900514355609841602199024284064432730716819535362999437955601505680044621346424145995516277630207025636571480793308725573658592416477974425715551688248730860810005199768563569856933716081211072123087552921980662387237338528977501032473645657541784500796609516395089721334802137269545043535316390215830859638003715261636804516687672127860171736591742478634020854620603885668944314198212636425768161888787863849446166560888103039697819946100007032111596677520637522585530918664455105387927596193127341972016954285678505060382492736647157794837404181755516538023467505710902540897225679029442662434596755260504663864950647188016595773062998278444920173757351135435507655333509791762024813356713651996057001704411097694785829814352001897797511722524410743303989717752166593171470315270532053606226515325209929900694098157845637929907959552588206377361800399193975280705959249076601849592619783909636009006486008525474188566602746477170707681111448403428159031381892984295410805610534027893495613928377287907133115446706909100866744393204386900961071510813265206266763948613306370230805294617386118795204017351642171799885187456839227143551731647080559410749491307172712684138581051438511559104763769297734980468261140479186216269943948100354355774556756772025229585786809668191530787539827832220356659528964887810941338508535349165435315319125715306249498506440031536896296226846896501734855525424457088475015961406579820986090919504914157928516231446783657094228572501427329627448272392342780397990232666778170943764484137457207454418564515450397829928242676299708274144757934034291140530955426265933794612440580288020
 :P
 52228929940638948074215174948453661384335356699891183193400084448743984610580940986304838509777369869112353199525205702137189699248078624202310440196597676526967012299755941727731501645381041376507115767109812744052473086356942282341401536551267772798222664582313144054686873851708243348283976060188232760347750847998933925809752793511997237493266312628180681575972195817353354439349033485097799801825026065008607729038073996701372619159151395577469869749631228167673668284370854234881159814339654931859552306104535515700234158793648421938106977407461232696184637384783425223239621449285490136428283970334365991269651000980187524698940221760291756881709169989940830488432607148239198314032779551332433894215719887745052784768835510500063539452644158375020215637848343719566186895394505286540366705893704698947300815090293262646504976594838891373995365679596620504981132346349468841336085358600975019086064775371951631637760390904778589246184194764104287804459156971241020975230534716216724835251649546762736795939249179593856796152539268329939057619259269201149774993801565249690995326072236921164094348733845610057301026936494411310043656647929430889759715670387973168091323431556212349510135162289131072861940700801909711552138635774534401591571241872272129583723690256813178376979576021847557848820144747726428517294046859359965295568890097558569903363638673332383347465492510740169139816646256874529947907637063127282926125676209831169130355328526607918549168021806816830142359369107898628835446991584701684283001742936332007033448915553589433173732337250626160485189329142280825117588754736873524603056894774985879050489565503137798209881015624317114408331858154299023136353095318837783717368367554537035365888023684406633592311940166594294178278106813310930373939773140156991847266435187979841582626200231276716567180595434016812082960749046897153166060310768319998567825736346598169365587773599511422348828817481408837202921826617379803185294293736162392254812988811871211912511681383189403143463846715449014204138794228812801125949707039206370017363428332884095582883576527388408979478478419558590252907888255815833660168557514064189558825951344497421488036364429730059375554662656882244659598847708664277936034785113536140431676669656934058161175460492175009196640716309179004972467076182581709022484239
 :X
 12632670606476611358237601749242987335833598980064452146077333224459654834585010940651782776506063714587133143390870431947765784633916220244220099592619953199615411869096460263194717470819398000006594117237726734528286716414035608996884168760054651033864254325603776938024737809190021497585118877562721855390688249465604546040759815421574166051205615163582923422122690911887514759385496179264664303034016637226235273386312187762869860828514823300470379433098119637953525521822238321792120131620049573526814323401723062543902994058287389354961592611215930707858594342444598504378424891212364454866184916187166888168179116815439455335510785638244055355582520384745061565213473059089758355017156346211488522757624393161103947820868924415082634630255828649861396261913930295627952486196939198093021454512443223169308406937985335152335270581308315428283671731145787715057324739460647066084992379997310775273410476731737172600722155446969615748929288471885368263159315092456687451121927054739353752433853301387052567372924353933136835108100788519961352279856562990045564742636356245804967879305286405062373470934644499683740750296326784976941817741906824372633384331246036347656352170905187744611132674253196337126251327181388078635622092784941808159357641421014218154850853252247319934039838998372012674934047156199382735198329348455272248142768170020681359895918356344434729398688571672725963363593613910704510332443792472398441355485763018638155769871745998912925739413199984051878075353086244453362885054702452084547055392935924024944379556933068729654257582601508068510214047620542728920120422611440074355451453963118575765837440699496140023660677528268856242292013662738608063263147518861977215755878568920353917040117061846295108450290991193756258443238196609563622332265528370841169764347693819430885543799967815091697162884838749998377181097327534737322520505349407665135298180183514162881198695201426035763973923902611788558453801346640087537427064041032239952345038575619815075974918312286466037428019041110953901303798109833896627638730146138074139405431912199012938896368946279396525290976531317054152684787087546742840879732147610142269288505134428523638325536555745798251138842537959074360906767243893096625569310575926341922517999257137945854621045996261409952141806126947306763406794063501267719005108
 :Y
 37273620771457450361590969062993316581075059952433331266875676609992231672431376904812386764375673504755473391152940632454194592148060972087422776723628042097660288726077641217008594006663105156700144524913204022748217774865057015589209248383873328256916360037817843739995196427243119246469255344293736208370304925925222290571259615919753029342448609640227450040470558758960076999297255796553718679847933056208962964377373582709651315406026172254653427677830350586685242798287505251796466227657120349983253464077405737812017473794922474794668496738808895468532295207732072688224779832727598200897927740632306261628589760049608788565332807555325673672872984569515403203699462545454387385502739042960953326486875516911157225982637780664459050108582428539534108978784942470004262823066858487525801264962606984223805423104696791140246453456567517316573497092334744139612415852406830092113959477290925234807701118929936700167475183856478880103790693665863017436627668571712704019423312366185119332677330261985383135013691825033997210583262243628175652794473260437348365983399743171798491678757086640052581608500373021321443047961385901649522985675266678293456609259067359416523668917840569485215984797495378859071129204233522274887772440817784909990908062061338293991682476937714487846651650883479868419013708441305046939036091970235680033386523209171582108392375105654296234880920733919164791665951074573743174996087443398357138881381730111124097070793093249677891006728629974851938977077486412724197213554802872070453554279459684902004480752722869970551813693808487776058540964193892945879695654680826518808946429720906302591801749450501983824820445492679154779203326966679020539376109814892545890986703381427825865578111290929863566131506717947208453926270878126359089350422433657699584433498896745670574514603016885371967269051137528009052451150785311896356736905129048371830166128645833468518579291793241282665754377023920639663531264177732388903312671537617749269226177645114811653048709161917992486128602936761746188064161529060913085819781851926789205817286535003638830608193918534552002502888064699589483278839301946875813961774393046970303965262744929302135452830711749374096770113346028428867687249606210812543812068756243019198405425696859237435308950507652580014932295704232991233252031183582953644842666)

(:S
 2017180596248615634437198763026858784825555192597469693624594719708437839720746606903404823168948246113243833545924209639318893074332703796094139932738677
 :KPUB
 (48767784221073849779534567402935496003872325243972538708280285423249940588318620162266917966780562047752098924977558296707043210206663567699944397286177206057878989287762428761145408817098835431148264758761079239139812357914451835257829179454100273893404719993293691832029914604655246090833195963049990179045660999888852824112109850553578168412992527083495508851560063035909607420457308883146150500472768450865206199102285401051379013903351906546868393468119481607037098695721280699966701936484009882197743333775454016368202610656553210451633089501250595623964955800972129709133545469641697425528442318113421635353638144561941540694783658058671758112819616599679734444629637419436004241451063655049685452189546839522296094292752979812417802744617376447883843248646961154717979125858538536893055021900940260460830094679459972973819036893798010400599330868885563819818382965667049821632695673060531658812839245704419279678146089628587038845336057843515813961305567058550638328302134441429282531624182177819009581181702326645925237830390777640450734049645041253218517036348590922677739992372465182215922660597438256325413035420489752631028537266815445827684316369410832409275714268867493272654919695156757667855140554547196869195983993475300016871099546847126053650705718754830786043686286838217882795642030726995863846201231961254224201287599506518121810680235159361735362890559314626720437264019920700252555027276452825401756643466793878922615102779645754018920324872550761886470332582023363664239532507475897295671862979721191648246775579639030059028775211176915921452092820493188515785643523801954958806380147136099950920725211477936804714096923472431386609900181677477944194371348567924882117568498198458662412561382897241798657366050332801045470600141475189833840721240538423436360301570407781176397569915264738283792097748742782397776893853885716225275549483183469567468815857115471453291705803168108428576891574726011880711406509765396339268844550277747520647272762252013794628738120578684715682405557414129701554582731469193293353080953706325076524301905489993653311530915366967091156400727296757694119294630878214178001170684835979572103877288265804343532721238555545994608493540827167527486043268182357308897135963815077906660299582485000700585256562866246052637156121767005899703158047725603974294747748
  30916688612126840954020679065254438289015225615938032186500363286561559712161656003002294269107353303858023750365426215753562960132270260112678243280247091812984794740398223811896766080626265290676996769868455852266306191988579538131506747974980745080877593799318391642509747283232348425246665117491978703727766252607519382878427297835795770941956391774590271339901569402139234320513601701140417367122387788919695683014198991132704024411215439037080341118039298137349424211866819313000348757455342037898860066008160400150584057977742085175402618242897229089009295459001479846757775537049065783662174048081137363776332145508003802025116368989439427281753316496606504227280236385227358302553834940880400038475575286240740534724800927933764161466634067170802952171467085809679429361461468719548524833477876590505476474475298578554629892046411481025224055293992102143600328806455523178418641693150856123136410531461208330379123947682838783017321569554073375227104691738997909483083549829275819082308362929919309969447730249027421219499450354296384538404584946099316167087256126805003011272502135136950772166107746401197403076585907093747977058276267532788410249724110736006112348506839007070350553649098050807064665820277419345243850910556964495180586424189240252136868708063949282932239347274937619173344328444074745817033621019112090689965696669390595989301272350872427660675461648345313775390843758463732343080419800734157269963037131346245034376915730077483064883805621796486655968301166125190785720314031272406188725795861930125644695136621744271701254379447370421436259648783363348733528584570961236053741961715864933545884951872458171086574741978039512301154570208057795217956797141709477076199469117613749926768446864992704685499744133742181618801629560770661524076264910614816780355214665510275506397954333425345053266184978455180198023728089521552594079651819403562916020658299647312235095406311848511865163454952091657426229004666964732215700494970542648931878844113769639444307313731617486271372121529721500783850595786957496203568258732962293545068812812974841439292534676383414931914628673277508770704573242947271731784905950147532374723554610451736261086681553392557731651288660428391503294987239993401651820441252506429734943366150759178855681095421420748901323924431272731461062032717615473509293126)
 :PGEN
 (70395552552007096706468889323293825500632002362880417645515333888725750125281057914950322167975860518026704610237082324801306455716001203339337856828988431587294467612302899394437558579579476743328387583593330383978516726763929033664461419421004611409839654034848139932187576180006244499339240154701710150899133206861885077230878963348073446639629544533318925339434140729833572797637001705486653126509096637026434608046550937145654131168633861206062325285336740840245942008164673188943752263364881110338274451096183321089982240578682354728080623115076482602629437410831471795529684800797605101782648843537473953427099494057682617436308618765436086233551768588176328990926577751935401559782126554120131406416848056892140199851334077857967191102297514945131118118705004358169849930319088410316748241716534014509562278525460113740093902153969849283988789923408764379571943211122638031386456898580307774036036034478737605571144991421749077592324935926050252789423371489699416627768045678671173903605618350073234879599675966099149523989453696177660879263676252098075103575453130508382439937204171737738247997673087594058006999514265718177913295411437206862240982488025788579896323038056266410587528855025328396693162491970218660262558130769526286607965689630499894047403769778423658828849701292844889379574491297466520653662789605832373069367992433381476896867641383142176172896934871329008973505448442138066232187881567581159365362670769377791892047156015548659099564369791163030105235596123314536721584271422927275354196693779495863995662533469379793988007727880004275014390526113235815495194527990752881044345851388443661754441802547828419382357970453064429518464235470103691802797875333962251288385055964769337168439313616727666994813613473468492372032398164275934607539101837601617753159206588413228322152165356565292667185648437264349147475702485069116386739252125943528161866726188970130410095786783505499156564597879948180606881819476716573099518131561613485543491997317794643671418809671183751439180406676852019772891675693652537958723163600224231343160424465900108673265569164373365819412056254918200205072119201657770682740445292298274925737346944660060910771636582716437656483895264895952336183213492364903561393164845492963541508638943993901448837417581959656564968027933421464828654207665011650656077911
  64690360241059926269852937352208183796355503374667305686523351085106020567554306900859521964821464933669946298265157401892337107105733059352553316012019519982778223263941080933849896213866375116356217625147031662973444094974617013656481636625880109751298529575452354991858886806080608325301475759026064436672605276259299331846631390645006426186107046332340719432906193019411222379437811102635151812273839527102291441868779206920832459860819729363156422583792616628272392938030163784907530309131384849407710186234387209731053869112249391742585400089928041176489495735356218188271395623814235059816293902504095972600375061500270725548667268242108672359055072691246434765381451604693291929754224209685314451537421827013924988227297710513257213847561767699458658273558918914228865859762004566952281119407768263115415714172126556053593476052631088018321502565847912651199829779192286465274041763967831896325201190817093345831610727985331221602181479524811008335886967876602720845066044833881829417455136642170632919856413296919489847150423168959641111840197306368757494171144962225813168979906414899179470198351358464884435725287548687914937303743880271907287153294721740092139026278376939081797837058068960518742075535681769034471244189176348659646879578513573438307828286433844431179345993529437462084261120257202389869469912903442547294600510429807936742526056697097852296536890987697961908607400209184989307745941217674481348919033027759289834708557052416456143806166947935785517076813203236072698460089445718093183980744022717960759861720871549898048773498045607784310198948269021360960194447697023562819325352486043160143206416184868204757605012678501903771004647324803592327192443889984825536642766231560839402896393308819083638063966748994913365024001385631607723241557016768933598572841876877088375215002013115477259963028172087213802574315700292753065227580564549766236799477763499359335153049010561869025376345242234122597771724649106136236162158935546701402063324885802192447271788370263133202249947799757165752875937381672522513704954499890240674960903132195774191363540709734117758655479834014556011693516286000987254873309461904919487660425464093839286415492691458206067414876483421798383002190085641447772183097877894099279810170942840942569457642234751435017457720694340626466124024127399203608963465)
 :Q
 6703903964971298549787012499102923063739682910296196688861780721860882015036773488400937149083451713845016020437095358608309329136275329740905552998825983
 :R
 890428888871128312738360863916072752743667623994109244630324387782250758831770447363447287415215504299704086725331429926130427484154961898930528230454854879729338553929541517447358814332594266430431160006581367432431160152678383649548657346112979956090391375122905289293228804196062267139797268433539186542270159178585513388100591572406454849357942440700691330340165306688379467984971396804331857050668678403171346624958884632190690059531676617845941234428799072719163663368693800102152132056250025045298582610630502148479128881507497602291455972936435100000694950279812408791440264515925365652662191337866804736271051864583521154072257387544722159309564794898660395032233137193089566902837933397138873016217478930466032838358771042269926601835175789006530330398655710481475344489684904205106363680034706713310891902285094734749476980134502132637839737768445234465190309751899413261776197912589873877751015371560744327119019670522796359944243159432382223498077517200237748320530793403305017797424963209679005100333253224687768477040660444597790357665701923886630205704702056066929725028676819853466507990613429312286980130847533208318115751898607817100998854397505813555796435008234405175372146899722706626876568432562961940863938996760378439244650382851168668266950525134116356402293484091696530150061176823790081913585051163344827899094393383381560172170652298421322225199022789234349235766063784694007324071440281895597436190362118606666624218539446758922579103802532121339850004675965580379453034308889042147131700542509083373452895266381377385626647531836070588100292881985607667899179331906057096538174248795886411165717741709691202435071089985375037279337340706113679417540703690438813606948808539858917450723818221495477651171335182059285052504415089390577639187686282280712066002191635450026740962333951120611319941692125031042980858761294835044521779626187397935145247895676612032676924518974066333630597171247477857060488206737838130846801918628730674672719768176817098367200209668256290172345221596266542427691526281527665016570227478032394364940851730144718509893357786798470417780633796167066214686809097081014522665738797435726629650888042544
 :P
 71632197103537738432419803204747021590002507236764522378396897988031237495994363932494311766155461342625357836419712454289585989944996689621243841404646110050013407704565715294019006657325587423014425727153642264324419150924804653059366670473075818850869372539370155057110719897306348526318542272725165808007681974119904299282469645718383668879607312165600956717145968179369057494689650591218894512334687764450070313244077098611074285287205140742272971232187212584410949367429768379411747674674084645409686269090706103672094814230454710327354334692344991277598751205763186704421916545611161726881813558361815518654812448299125690050067582245486467374805245909590661270547600572113875821680112965370728537591959872233753710730998678939440148852705129563533559724715996607234865050313775138082499864983666668217620118964216934865803598233153124137992372838633387406747533277326840117223108724397776950925800838573664490180107171333589298193655682611340214034573521147898062620835222165528101907143322321566442122622624290529547526715364851834619613968128690694573945734059680970934423035948078237925347333498555590161534294040375526131731539690755185970161029298795807611578247943012088998364935129652686812989632292882756873150006074465528553926360800288184680465166855958468350615157877864718017191091614170520480659685117456934666415522366875700659018546323140389702349428484005957569721178303527825438767851116784596441167841901640902772220043996497838642171482414548840236075274170908877098297312871089899379644575723965121501128060020351221995474912670018356397266132982045882548010687071801310209748196919603506313660255526637202505595154934625226266351184964922294267135505303491441735952171520327426262856051645998381516370138569477651082818026831320021068018041288259133859046675079540429074615174612001098492884735586248116587448865924932276810727219733077425280865341002240240068833494611367385401254332604612710553183329904890117281319702545010793558273607720578840754655597010704765868569406178075399402254395852156056341873748668749362928555630588859684681478659754685535342455130264127145439448329832649210838051033979788576622035583330740235761966594470105719101887557123471956238912446311152576021339911007721780550050183174695859908930708980323572483591192999386887381014795291044002459479449023
 :X
 36379520232820144732851707806499108492716539618761894930200584148994339239338085395130964816599791519329453049394746445201238075740390955088249077489045703296179606363290539768755576479098222626438383587814675902295595879027215669678536759248656300806353794355838214284723760514769759036680282361715219232061661977872074203876834295222053398896228463970245916526473857456577569359893301452519637370909988985868017395085481363770596670901714356910971375929968691193259686320871148710655397266593565630334468761908523086169621996585380315362053973955441464697400275155165486995258127276550810416473755624068682953563407970202553006580899180620938232574540212622495118349851321807550338239692885049807483707065534718004082057040343814226163771203507714925061417441747229319949623553102266668859466198292093262803257655657195623950677282624218162943994999261018723359163267604095517833488571562746785891502265562068852149026345291061353121087869532998221231493809063886079780836707692804543814594954935165256192499647753402821001153015882737018475700471467153798997665103236242132368791818369205426218430350616900517529955361408881731688715387321302989401000476903954048980734974685183642627056057322294658569431764578734726259051669642584693746266530503784755498672928207408533714771168728690673243552140315322107469453109952021865654897403897424254929031258589251426520792200051552265803247932217865610303777061279843140156634673700311395652613873766639211444869862677129107948112589030339343958708733259369440356311422956865183906554744241908947017175555238478247964561590535397961768921700564296976414957295539885468606020706421586945469786077630823672424433651426067093583725741739574289591324081861034536510880215300964284089139548324756853225972849244745062796111059085950231140400349125375106659204224665965605238948369418862020139474686491473272288974989617381750939590463290349292789418594528126916147508660278765776921468819728512718990886542509697598457602295682204589578301705873214076032434658028518894984498602651585742650585795622806931868365849388223931180139415107545283631048807048053396435241808506062655723785829324941837319536815119378719983571028632605135216285771852525382967528049840066088534904023848281497803385081519097239553377328270887078527857239717344165871987494597388555687189704539
 :Y
 27880691603117825612926747707068915451345295366041227800620484389314507942061372421208806842851248363779219316854263326742063765891724658590251274973272515738135608649487376827020663929183028045987927700613115913302877307643253201142089055281460725695982352338503876736288613719794160135071127296739308912596894085064516924821771372187270913481894930168842801292913818669111299923702980814641928437969115072839800974699697368502805832687120481457167369219254317986450424728869767804024830092362197116716223055009013665958729812045170736069051884692012116393434662664906610925296920408207887442712274109138443977392679963172651825609924551197626217736266419254604749755598119091328310236946209061392877167142778969460348087171387454688955923836667480702399647695159463530470652085977687829496832479298060294987552282334833393729703922871094091568094247001759456927595342182518509917268543860649868757679407746814075530474488991245614969369860479686321289718008927358759063323143257659312423625660308851895026047281507099209293986706645271697370623896330717859479661324469884925126592094029599973929787091074967197846086998083415476036908964182320386157680177555016968133601247911901386981225148601853594866254410349516548503805019229838173284148650877503189329976291673833352185008649154046288822704123363098993467540630648002193759469163590716270170202846037126341881864898998258965770648631975936464123239630866726493366899000849695764614327839065760189915354120500645143485188431381290865582563200959518425638796608738504730759906745419691575565608447428255297132020536640723775865949731825979424574836417960366811664790381524211091442145786770232858557596832843119966350296452105010896055280141088850808153921611368900675556178266666498816487381280656558468383048663909051200525038758437861871917748028911272824450864673912085794453152209487721387230519626362102038050462944677004731699430401110733856549337225542751635058172180260772264784978281701175805391233540334962646652634958103769207544760280013977044548170260975434759123839108043901523679424859542844284010385533143205888428904798208736301570858867786775784362715900048476908129734807116374280577153381487485969890154490497950620647281839201685706335513416499566787777189837286885614398735852372865329619062519550006371556828137947685372958987228965)

(:S
 48963208217971554331665286251984530022199038652984298499125234556044856035382567071220726323160611103751631423527616827198896813203400067523354594524501
 :KPUB
 (57053589595033013767344601037792907992001532269196916947271499605861920045059658124337880526386871538542596536287420747835110555883170526854094393220938931247266250287298227858555173525553015489111202313909126377348586106964040480496876984015578545502597675622895413136083687655893269225950900229065461432729001834335906970989721962988584346654585263776221046199154112743924865040241955297881632044602084308493362795654928793080348158403991468314693900001039533190174422386641789268464078585734113660578649832028433279426788015373370283342381204000942754452701355693759502965350188990831255775064760608203527632427499949494330274277116405937705317018366593859270472411063452208015428510211566744793957231746057003725092325812536939130368755463127142952868169039928070062063225861887679084870430633199460470388476876167780442559198105203038572677764832767900095886108864914452916134723204443579679088585182121092945191417226387454551306262385462386293535557063411227687825386238738144047960191150118089550422318562030257693115759467158329371543260994827375926405402356200362701494946887792901351019890333513629237524334132859097259558308532553769535256855690066340649597570706639227311275488075786298680032517535968684742650885531707117340855737969118544102612398957949760142615650244550009074554861955434582342109711978667454779142229681839133698502465337890996318548965709117624434946936876286039250275280691447202334754013157150736539853738281842562428097918862835596738928281687054401841688365049280412217532638218718610268977917393092506722326132265547893052825530732512790398447570565234016836152388639391957885947028107605815375218668749110710969261605756869584968885831517540140103195954562090749313404579176187926164706025808749233641658687621007883776553646434769574949289134495162583008616415739805962723342993639977956813152829295827416468648698477684025808196584567362132044610605281563311710737107301971138237979461865893304896922305590112105457401495938495630833773222889714204069395513293586351752618928998521682616331863217871073386527393303381409547159061342405722964636301381806202342227625406085754651426744217857119140569202278659392285682546389150928368816508930790265047735394785073585427801998894982401920211438781818862913526921293299585207886908865896039709003431040900773711043295347592
  45840291518831213078516130089357033140864264560409070911709618992991087284295530277435571751191038001257631254657609408852067552685055614411239004732751811424368741026586937471614708009536962603425764875624550385721851368615220083887877200138525284960990154677726425208692648621732357708632793714763632031280955613465547244010227665795991854014255013055542642290318126484351106640594140029569893743417679772792554152999805258307750182265627086561719616003276634442563856433741531907374303952000903861433677350641526766715099741637850331487698351902411194402137496288540218430749688693804300623803339997140346978383846549364102511948131236170590430521438159909033371631618248734676552680062621214308180668956950248898832947766990438255782239484434215444826508675716919068653296449665869146510945950888706288590673944724967939248162081936216227795008538553068429933258135626511634850795843033588085094028484718545812231627046878754617039304967004770986551815851807371027280437547413552962266002310364216886490950641237415361067646574268191115784644914068157541874871146050215630825428565857494515965185198764447585311634264751220205178885542187934358069503896883057865527682135590380486512245213264133401558448120768214213813463670834557639352425623521830058725187053754452892132100641734479116606522932213577362612080619764500460117307413426817056769021804280451976488834228436561649859926514295049730942570078740020897052075642557352507600149531276452110573247400069410962699093551988231849569017647750225964326231518611869788115346807530042772888172367347514329038073699601994438632671016026497207977910815551594791531558081816580171429000936716749127403443857593771261318597414562728705447418247394194139789705566789500970769703940463299007261394036411521636380839375718552749444518816129152080762822000170060645257111706170502472236907910696179047036537755462909668705083447109553125735515022772607439847517614610339607407191718500552222585972937110098141319943492362831122312663954931610811772553569195911453547388787990499252292616385466384297156873265956961582055415989079372896674215854637118405399704927354669745695127046241696370776065222861520785011299252645251775731529825801611523577965740133417454809154314302338095274507320813400444927752621044156773566854044811542758549801446009832937255371645941)
 :PGEN
 (1033474436243028384478016585688915860373820170255091806952924919410188663257804959485607685296525907492853051666839830957164288009701128256076511930274498712346361512835034651343824239496661680643097311674442707485734162475545868814558680508444367213688900041913635489705718296064186946828091109001942973551883238838569506776666303178801957381254361738323020512833198449276328950571278365030664518749078080965097457006115594757753715110450856421213237200826168983092276415503814319132957076803138952832390162970114580010705605527898114522173564816436121188685886817639005349839250770250421071322014988241876467310310517698582879489791952544041517427626526470898298998115789686586129204385968780722626065712302316102398156179303964037783883944896011720980894851961293405889798998391904714478408669021134053552474235327458393390073200909146515851372428183807663165916285868227776074806454668336928779414556000572478531725635756466529313300658777761375839843269794094697187036930043637302216252771853103865537939130262350218514093855453025837870340601050291940681647080299253833315668252732773184549843883997181758690481660555205257459263685712036455908106885763730622549786096420931795735938393808720665654660771326506673260952725405688151570477504850105530819824125822423470488170671224064967688133304033136175600627189819467095410602567244929609136519364929154463332476998320189417430923795874780143765035253931192160196319396099891480466118633530906165164573217272086262891110568003358050815444747579990796024575237234836997093331365054284813329259897532395346285449039597792709596517473413512941009978663889291332514697299789003169284741885722055657223406352748552724803870428150205905384366317302607571358356157774442780282171372082083005086299500264513159369470999293869729167751387840539789516802524549011322836176914979353957471797518798670486425155204662152047158162415328276857772389519674247143995239365884335628117228485147785294780085472773888090963308048627208772320264223881207887017548629052816367566953978814481343852987828768179275179118989849706402622998922455446877108400218258637564721927659040544316782184845181511091944027641288113481245014255356912221362231329123394760717597011157715747222537135215961286225942766831880934208743779132057729931875503171684775575744143901777617373673818007
  49996490338647194756499666571119309284018001311323646525794450596921741969564406643238486990050004687255380762969321189789940916622116292647443424555651389534569744120523194848187116456868090013603653339366727875104219113248688370814342059205293944207808512375177063582424211003499949479110584310122975970952190809212252637320442155538480967824968018695039200350887850952406917281089309603794426106142425406730533976597934356574954216691886086215873056768688086946794317783411030215949362960081216441022214703260717713771925795690331334367069952432755406176213100637770529269175832946415085351705595833721436049874194469860101876839665359977719626729769703319735952849349511262941989753026666161908312267749304966262777583251082852650822581059397233816423915694968485638866359118085473581338370605363515053463782714332910253192843461555155830206454844922781672609165734561388856201616518990745982183110721323692120043119021646946138120370723468614396444334992117681284895310634195519856328964459132731666679778344488061690351765606576272473212228627013646060612381070942508984380670586383414705897394331007544478195937693858683422969237542073502658084513033020922068534261177862833304156194371981451039619661872896664934588415519179890324890185057569502283849864578646259012596687362025706020990119240915772698882474345859442050620396662526515201825618774858796647746298756517685856861452671240494784773821528230807844753654432930913299594399998333911140825800269144715070635642281087184625354693423969468724617759990555318048919595690892878798971708802484900707011848230726790894534846615928989558548858656847706772073078281945359810499424896890816127342492835409285366033919487684019157907945244961264978356454421363587778845680609611488482140334755325501411639429191618936244313089820395603789259306587715275504374834927566080971485171405161457069185665151644129074771881610067145677087084081361141360330054215899009522740961156558712930175566811158859257418099594491310307465478706878252734640008093428693814446065786443022034117989472342667505477922614018386927634532769334189295790722674167375190112919792614512810847807790172674318842859211752885343552170467555421004113993659577049147077096110487972775713568157551623412179855045771170595054350916108817056759678358653880838412312409681936058276668064985)
 :Q
 6703903964971310458312671358326217823860951347362487538921834222879981666972196863995033598995027490159190823395501172960030938471032548004129907725565951
 :R
 768915906557324375175837345684190184007749924990739269240862866153891543055906748560482893100555561836249748541460346197473967480934872246254185759195430120387371043603860919030992376749445174800879119342445067102078826216428699231884178718337904847576535916283023866514668161442787079061600374671456668001745668014180953910064504233471241051466057203007990655408975829062310817859403229749094073708833524556891685105921443223294175327501732190580659179008587571210468903491709148987504535447658247840491157414221262846806328693255048611229554014718506899990084830451572841758662350845133928093387857195957688238545265623062591475235072126478407905986440724170143284113081557619089826996483592744567435771985175827657862352196848034356367584937818230659336077100331339409593696118273034554018513677126487409166844337705671781580486232293600957228723427650325551298741530542153684238506443460873001473521521452646844336366740116852442311154806145908972807129593880771092557998144771460918004944362609551664420707674299846825692314873976158555819449732916871491989547354648444393364806961545388793232111365027651534260852713169227985704008924362459002461045202518000148267824765177925684294925925565777688647253606692941329037018367037627077715615925800677424586234269446905401721019927645221213262210900441996503404199418141836809058072286050352286520044018159612871574081412215961872873426804752706736627091034321143474290421693024795355742199332946579821581481796723603248545205524549111768634815260122021430954569895181243601849361613817400368760459121795746941651921461206247693354384508090425676668638368943703822606120972461567358465657835927218090532385992660549531483736863454073487804054431590569252139691385864571070476354425764286294745384693484430979756026015531096356461050705821066252395522833152047184708734884585041005033620655261916436049319148236815297070210037729658741218877568553707204816405887064211178250692093696287818343898429368595264113737760752106068016158129338140371439811330815303231459265163079759071845086747285146377856728821565595470879671393985918600278217425844375727945957395870944863945511895588939236679731774039176757
 :P
 61856860736389878402926605221600012725656688875795878945012702646758557277729996901487650223757535593208413742259212647245383239480076926881942913192862839747020519627265761325209055405470420904898217771581376217322386010980609434362764912866753510487472220420933007819128259431596056538893280801836086080947370798159215951938070723033079178456447265460206220758661407893997413188506067833350982868277766382732830218880401677244156358456423673399645492887570836758591699827076804738894268422216442065386427465558552237485568562541529825671726063133221167573698212922858296153608377578211736580354495655330102340827833719706977451973815721363477535305993784423029416597408842316780911028900303229926046829493192116338519289754726381777305612036975509852957907420382489980295940218724672770221233819339083790476260503284308127608528980735801918799107496087947729866266744732211769081515300337517529015101838780001403923720868432013207923336554209664538361850354645851168023695232188325773422614546175710141615543084996963066859572608691133921036934403408139249273158369099071819249895519172282584414296686092740523258956189893627287512099769702577100670775176631598732193205354239172486542140524984343883285562790616435233298947022206987766848407023561770929885150124959404521499919241733292267289327208610812928907088743779399511152933049909011967294843012878829295240870793930505903586745837956027167888888036295555431273017330804654154508094747655081233839704784279013515835890805992173246977671847044298929677850923233629739059801591041561250198989436529776073784504552653681117024502685697525698736647209778006820802177274308692943329256976765910059817394100828911171813830770785994804807503121886575647262183681520260420798745678487006139553550894750048752618199945412745971588178045975638408328673308786103816432702998294065420306942830214742057387968684960624413226641559648861404289439303004198109291834316277701763360367102584015399692641878239183405966405736224255801707832484275164081763490666147943420499378607805200915452324342623648865357119983168060028352122502574582935834051868967507285640665346521621775961829559834788182657930070086057541284857425557047661807516584462476696681265206007564913833966170464860867483931698979847818147436712689477492434460282546804177148318687809023487927397610883
 :X
 41454367602162158767634632541109420704836910999614199228509531726616111909759851469906760232260851298691641244329692038737567212704555691189418808463670548351285130336280809223997746313939573607562746958447821206723052238528636247969100618159227932748754017427249102773238195721138525381989105721636529961295116619457638097072285095433818056054583819935218979157971816042804480914426745191989651986193416124623011030979097915015299514684454139259731086010207349216932171048533205240608966260423111023488367815205960961233896901750174178226248589371343450435323679823390605117621677316595343466191207405327453876437701247580168779609906115136413447713007209385817822962892801393436943461449140523306264705041931739404976572327569686754500122762930122089575449152080489333297236772208738177366873378084071166349632304281270184851423517703889922452484895178781322620849383128701962048826521054859426678548445656484294274891558862122530301892751887274625392091212028712757163729719619001524240519681554379698526149784793428367939794630634120488830298377250611739209974276110050504458322873105596927359914716402282857344494943338718547352107394850461948607325358132789565317866206639963852296450058588296083028930944806595634322542656434868754362047651345644242967073518287965564963417853537610979120682731053731040463392705923025636945692767710244579119109351877321049725088668793838739971313210350225513811559280470452419311783692850494840361783925315461668175279541577472753957641678590007813069176514632167640546863141294826095732808840179614704675110248694317877746753436589172430080788720960534207632718993834022291634745615454068751701698592815105341513237335529192204001543469588163202145723226166287352968849662265222266423559697444352630771587918454666727293175316864543923521507233822395029647134957861674280107454705033166892196302031605665790382759945592281375711742114435272132134418935677005857588863773655896284212148270045489255719656079850373315431018397961340923484310336025182818494378275126632124784668884701709649290547196134652704022607476840357213496712706166286397626490605510227970867735607377209038835098684119920274104269208900045822371006711659894660128351818285047238409863533141700071874739752641752209065142421609558509245354097155785238667975366710940807346148160543489470678937042756
 :Y
 4664159430709552874829415273867866908800414796874546742332158495835277130608053544482627621553079442443764250811068612706903469094321560417148415585746752929683226999723914472086486137257994589918547742715730216692426858017353754293761983579271427007405110444578587264021651391170858153269725343819078069992009853436687360996873948765374927671973793114932394949957884517790231166380068728294658136689489890740034224325272284747295186276779111945218182399399340500535850166356025973055032523266400113486534954930762498143694004465279087023004425465047050883840955153820925636844264753257345499787852212385469147069616250933129161721155122687379360777905044349000659564284277292321380436626871981129455837574816697782551689094716541286784734076162145135288504163526936167476732441019748618642055344910353393564007115510789010293982614127315528188295561201725788379931821800542599863708790786464610570512676148620273976816491244092524769227059854886053383532145255513209008660440085409736895820364347057589170733016610190648138902243936536415902765109254478381835799145853855070037254136830317314445021168385935956814375449386561110913604368235860435725813719916898536936081269311904712868093402113306271676086481737287965447799790865442229099222903968572288964969863220266590675747208086222052807553530070136169233288646849604400598618616901543722039267356271725453078825148284033475351835777952875959831041615532031111151776336168060128859631611886789980178160717025421791190147774722009319011700593987538443886604128206870776660719335871300999682856752675229219222640611755120454400283651085368107024908578283070995972111105132806266976654142437274311423702448487543923459679526282660500356737284037461344395991769351803177093567018888144626640284311489215569979537472406148256828279939350412939738843205043400191968970407302241319396084437283171199933289880270708721950834684315405207873089226215420558020538967453770743613966092934833734180647592616177290824905451527623427343970215174519567090330373280987411974337221424231564193674931322356062335628724714913108523969356846284370928752939179657516508898765699270259974496430360417880816891243506085373250609497589350615483104085205215515170314850513989574191125522713642143348890071104632573324147095253771343193914869133940834630946781965506872308871815815)

   ))

;; ---------------------------------------------------------------------
;; Divisors on Elliptic Curves

(defun eval-vertical-1 (curve pt-b pt-a)
  (sub-mod (ecurve-pmod curve) (car pt-b) (car pt-a)))

(defun eval-tangent-1 (curve pt-b pt-a)
  (cond ((eq :infinity pt-a) 1)
        ((zerop (cadr pt-a)) (eval-vertical-1 curve pt-b pt-a))
        (t (let* ((m   (ecurve-pmod curve))
                  (xa  (car pt-a))
                  (ya  (cadr pt-a))
                  (a   (mult-mod m -3 xa xa))
                  (b   (mult-mod m 2 ya))
                  (c   (- m (add-mod m (mult-mod m b ya) (mult-mod m a xa)))))
             (add-mod m
                      (mult-mod m a (car pt-b))
                      (mult-mod m b (cadr pt-b))
                      c))) ))

(defun eval-line-1 (curve pt-b pt-a1 pt-a2)
  (cond ((eq :infinity pt-a1) (eval-vertical-1 curve pt-b pt-a2))
        ((eq :infinity pt-a2) (eval-vertical-1 curve pt-b pt-a1))
        ((equalp pt-a1 pt-a2) (eval-tangent-1 curve pt-b pt-a1))
        ((equalp pt-a1 (ecp-neg curve pt-a2)) (eval-vertical-1 curve pt-b pt-a1))
        (t (let* ((m  (ecurve-pmod curve))
                  (a  (sub-mod m (cadr pt-a1) (cadr pt-a2)))
                  (b  (sub-mod m (car pt-a2) (car pt-a1)))
                  (c  (- m
                         (add-mod m (mult-mod m b (cadr pt-a1))
                                  (mult-mod m a (car pt-a1))) )))
             (add-mod m (mult-mod m a (car pt-b))
                      (mult-mod m b (cadr pt-b))
                      c) )) ))

(defun order (x)
  (1- (integer-length x)))

(defun discern-q (q)
  ;; for q a solinas prime 2^a +/- 2^b +/- 1
  (let ((limit (1- (integer-length q))))
    (um:nlet iter ((b 1))
      (if (< b limit)
          (let ((bv (ash 1 b)))
            (let ((v (+ q bv 1)))  ;; 2^a - 2^b - 1
              (if (= 1 (logcount v))
                  (values (order v)
                          -b
                          -1)
                (let ((v (+ q bv -1))) ;; 2^a - 2^b + 1
                  (if (= 1 (logcount v))
                      (values (order v)
                              -b
                              1)
                    (let ((v (- q bv 1))) ;; 2^a + 2^b + 1
                      (if (= 1 (logcount v))
                          (values (order v)
                                  b
                                  1)
                        (let ((v (- q bv -1))) ;; 2^a + 2^b - 1
                          (if (= 1 (logcount v))
                              (values (order v)
                                      b
                                      -1)
                            (go-iter (1+ b)) )) )) )) )) )
        (error "Can't discern q: ~X" q)))))

(defun tate-miller-solinas (curve pt-b pt-a)
  (let* ((v-num  1)
         (v-den  1)
         (vpt    (ecp-projective pt-a))
         (t-num  1)
         (t-den  1)
         (q      (getf (ecurve-parms curve) :q))
         (m      (ecurve-pmod curve)))
    (multiple-value-bind (a b c) (discern-q q)
      (loop for n from 0 below (abs b) do
            (setf t-num (mult-mod m t-num t-num)
                  t-den (mult-mod m t-den t-den)
                  t-num (mult-mod m t-num (eval-tangent-1 curve pt-b (ecp-affine curve vpt)))
                  vpt   (ecp-projective-double vpt)
                  t-den (mult-mod m t-den (eval-vertical-1 curve pt-b (ecp-affine curve vpt))) ))
      (let ((vpt-b (let ((pt (ecp-affine curve vpt)))
                     (if (minusp b)
                         (ecp-vneg curve pt)
                       pt))))
        (if (minusp b)
            (setf v-num (mult-mod m v-num t-den)
                  v-den (mult-mod m v-den t-num (eval-vertical-1 curve pt-b (ecp-affine curve vpt))))
          (setf v-num (mult-mod m vnum t-num)
                v-den (mult-mod m vden t-den)))
        (loop for n from (abs b) below a do
              (setf t-num (mult-mod m t-num t-num)
                    t-den (mult-mod m t-den t-den)
                    t-num (mult-mod m t-num (eval-tangent-1 curve pt-b (ecp-affine curve vpt)))
                    vpt (ecp-projective-double vpt)
                    t-den (mult-mod m t-den (eval-vertical-1 curve pt-b (ecp-affine curve vpt))) ))
        (let ((vpt-a (let ((pt (ecp-affine curve vpt)))
                       (if (minusp b)
                           (ecp-vneg curve pt)
                         pt))))
          (setf v-num (mult-mod m v-num t-num)
                v-den (mult-mod m v-den t-den)
                v-num (mult-mod m v-num (eval-line-1 curve pt-b vpt-a vpt-b))
                v-den (mult-mod m v-den (eval-vertical-1 curve pt-b
                                                         (ecp-add curve vpt-a vpt-b))) )
          (when (minusp c)
            (setf v-den (mult-mod m v-den (eval-vertical-1 curve pt-b pt-a))))
          ;; p = 12*r*q - 1 for r integer, q a solinas prime
          ;; (p^2-1)/q = (p+1)(p-1)/q = 12*r*q*(p-1)/q = 12*r*(p-1) => integer, no remainder
          (let ((eta (/ (1- (* m m)) q)))
            (expt-mod m (div-mod m v-num v-den) eta)) )))))

          
         

         
         